看過jQuery源碼的人應該知道,jQuery開篇用的就是立即執(zhí)行函數(shù)晰筛。立即執(zhí)行函數(shù)常用于第三方庫,好處在于隔離作用域恩袱,任何一個第三方庫都會存在大量的變量和函數(shù),為了避免變量污染(命名沖突)胶哲,開發(fā)者們想到的解決辦法就是使用立即執(zhí)行函數(shù)畔塔。
1.什么是立即執(zhí)行函數(shù)(IIFE)
在了解立即執(zhí)行函數(shù)之前先明確一下函數(shù)聲明、函數(shù)表達式及匿名函數(shù)的形式,請看:
function test() {//函數(shù)聲明
console.log("test");
}
var test = function() { console.log("test"); };
//上行代碼即是--函數(shù)表達式,其中等號右邊部分function() { console.log("test"); }即是匿名函數(shù)
//但在程序中澈吨,匿名函數(shù)不能像function() { console.log("test"); } 這樣單獨存在
//除非用立即執(zhí)行的方式把敢,看下一段code
接下來看立即執(zhí)行函數(shù)的兩種常見形式:( function(){…} )()和( function (){…} () ),一個是一個匿名函數(shù)包裹在一個括號運算符中谅辣,后面再跟一個小括號修赞,另一個是一個匿名函數(shù)后面跟一個小括號,然后整個包裹在一個括號運算符中桑阶,這兩種寫法是等價的柏副。要想立即執(zhí)行函數(shù)能做到立即執(zhí)行,要注意兩點蚣录,一是函數(shù)體后面要有小括號()割择,二是函數(shù)體必須是函數(shù)表達式而不能是函數(shù)聲明。請看:
(function(test) {
console.log(test);
})(123); //輸出123, 使用()運算符
(function(test) {
console.log(test);
}(1234)); //輸出1234, 使用()運算符
!function(test) {
console.log(test);
}(12345); //輸出12345, 使用萎河!運算符
-function(test) {
console.log(test);
}(123456); //輸出123456, 使用-運算符
+function(test) {
console.log(test);
}(1234567); //輸出1234567, 使用+運算符
var func = function(test) {
console.log(test);
}(12345678); //輸出12345678, 使用=運算符
2.使用立即執(zhí)行函數(shù)的好處
通過定義一個匿名函數(shù)荔泳,創(chuàng)建了一個新的函數(shù)作用域,相當于創(chuàng)建了一個“私有”的命名空間虐杯,該命名空間的變量和方法玛歌,不會破壞污染全局的命名空間。此時若是想訪問全局對象厦幅,將全局對象以參數(shù)形式傳進去即可,如jQuery代碼結(jié)構(gòu):
(function (window, undefined) {
//jQuery code
})(window);
其中window即是全局對象慨飘。作用域隔離非常重要确憨,是一個JS框架必須支持的功能,jQuery被應用在成千上萬的JavaScript程序中瓤的,必須確保jQuery創(chuàng)建的變量不能和導入他的程序所使用的變量發(fā)生沖突休弃。
本文結(jié)束