JS基礎---立即執行函數表達式IIFE

var a=2;
(function foo(){
var a=3;
console.log(a);//3
})();
console.log(a);//2

由於函數被包含在()內部,因此成爲了一個表達式,在末尾加上()可以立即執行這個函數。

相對於傳統的IIFE形式,還有另一種形式(function(){.......}( ))。第一種形式中函數表達式被包含在()中,然後在後面用另一個()調用,第二種用來調用的()括號被移進了用來包裝的()中。這兩種形式在功能上是一致的。

IIFE的另一種用法:把它當做函數調用,並傳參進去。

var a=2;
(function IIFE(global){
var a=3;
console.log(a);//3
console.log(global.a);//2
})(window);
console.log(a);//2
這個模式的另一個應用場景是解決undefined標識符的默認值被錯誤覆蓋導致的異常。將一個參數命名爲undefined,但是在對應的位置不傳入任何值,這樣就可以保證在代碼塊中undefined標識符的值真的是undefined。
undefined = true; // 給其他代碼挖了一個大坑! 絕對不要這樣做!
(function IIFE( undefined ) {
var a;
if (a === undefined) {
console.log( "Undefined is safe here!" );
}
})();
IIFE 還有一種變化的用途是倒置代碼的運行順序, 將需要運行的函數放在第二位, 在 IIFE執行之後當作參數傳遞進去。 這種模式在 UMD( Universal Module Definition) 項目中被廣泛使用。
var a=2;
(function IIFE( def ) {
def( window );
})(function def( global ) {
var a = 3;
console.log( a ); // 3
console.log( global.a ); // 2
});
函數執行過程:因爲IIFE爲立即執行函數,所以,函數def(global)當做參數會被傳入IIFE(def)中,此時def=def(global);執行def(window)時,global=window;調用下面的def(global)函數,注意此時,參數global已經是window了,所以執行結果爲3,2.





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章