1.什么是立即執(zhí)行函數(shù)
只有表達(dá)式才可以被()符號(hào)執(zhí)行瓢棒。
在了解立即執(zhí)行函數(shù)之前先明確一下函數(shù)聲明预烙、函數(shù)表達(dá)式及匿名函數(shù)的形式,如下圖:
接下來看立即執(zhí)行函數(shù)的兩種常見形式:( function(){…} )()和( function (){…} () )尔当,一個(gè)是一個(gè)匿名函數(shù)包裹在一個(gè)括號(hào)運(yùn)算符中识补,后面再跟一個(gè)小括號(hào),另一個(gè)是一個(gè)匿名函數(shù)后面跟一個(gè)小括號(hào)凳干,然后整個(gè)包裹在一個(gè)括號(hào)運(yùn)算符中晴裹,這兩種寫法是等價(jià)的。要想立即執(zhí)行函數(shù)能做到立即執(zhí)行救赐,要注意兩點(diǎn)涧团,一是函數(shù)體后面要有小括號(hào)(),二是函數(shù)體必須是函數(shù)表達(dá)式而不能是函數(shù)聲明经磅。先看下圖:
從圖中可以看出泌绣,除了使用()運(yùn)算符之外,预厌!阿迈,+,-轧叽,=等運(yùn)算符都能起到立即執(zhí)行的作用苗沧。這些運(yùn)算符的作用就是將匿名函數(shù)或函數(shù)聲明轉(zhuǎn)換為函數(shù)表達(dá)式,如下圖所示炭晒,函數(shù)體是函數(shù)聲明的形式待逞,使用運(yùn)算符將其轉(zhuǎn)換為函數(shù)表達(dá)式之后就可達(dá)到立即執(zhí)行效果:
2.立即執(zhí)行函數(shù)在執(zhí)行完成后會(huì)立即銷毀,例如:
(function test(){
console.log("執(zhí)行完后立即銷毀");
})();
上圖可以看出test未被找到网严。
3.使用立即執(zhí)行函數(shù)的好處
通過定義一個(gè)匿名函數(shù)识樱,創(chuàng)建了一個(gè)新的函數(shù)作用域,相當(dāng)于創(chuàng)建了一個(gè)“私有”的命名空間震束,該命名空間的變量和方法牺荠,不會(huì)破壞污染全局的命名空間。此時(shí)若是想訪問全局對(duì)象驴一,將全局對(duì)象以參數(shù)形式傳進(jìn)去即可休雌,如jQuery代碼結(jié)構(gòu):
其中window即是全局對(duì)象。作用域隔離非常重要肝断,是一個(gè)JS框架必須支持的功能杈曲,jQuery被應(yīng)用在成千上萬的JavaScript程序中,必須確保jQuery創(chuàng)建的變量不能和導(dǎo)入他的程序所使用的變量發(fā)生沖突胸懈。