一、立即執行函數方式
js立即執行函數可以讓你的函數在創建后立即執行,可以讓你的函數在定義后立即被執行,這種模式本質上就是函數表達式(命名的或者匿名的),在創建后立即執行。
方式1、最前最后加括號
(function(){alert(1);}());
方式2、function外面加括號
(function(){alert(1);})();
方式3、function前面加運算符,常見的是!與void
!function(){alert(1);}(); void function(){alert(2);}();
錯誤方式1:
function(){ /* code */ }(); // SyntaxError: Unexpected token (
因為在解析器解析全局的function或者function內部function關鍵字的時候,默認是認為function聲明,而不是function表達式,如果你不顯示告訴編譯器,它默認會聲明成一個缺少名字的function,並且拋出一個語法錯誤信息,因為function聲明需要一個名字。
錯誤方式2:
但是如果你在括弧()里傳入一個表達式,將不會有異常拋出
// 但是foo函數依然不會執行
function foo(){ /* code */ }( 1 );
// 因為它完全等價於下面這個代碼,一個function聲明后面,又聲明了一個毫無關系的表達式:
function foo(){ /* code */ } ( 1 );
二、立即執行函數的參數
1)可以給立即執行函數傳遞參數,例如
(function(who, where) { console.log("I am" + who + " come from" + where); } ("Amy", "China"));
注:通常你不應該給立即執行函數傳遞太多的函數,因為它很快會成為一個負擔——為了理解代碼是如何工作的,你不得不經常上下滾動源代碼。
2)有時我們會看到傳入的參數是window, jQuery
為什么要傳入jquery
jQuery 被應用在成千上萬的 JavaScript 程序中,必須確保 jQuery 創建的變量不能和導入他的程序所使用的變量發生沖突。
為什么要傳入window
通過傳入 window 變量,使得 window 由全局變量變為局部變量,當在 jQuery 代碼塊中訪問 window 時,不需要將作用域鏈回退到頂層作用域,這樣可以更快的訪問 window;這還不是關鍵所在,更重要的是,將 window 作為參數傳入,可以在壓縮代碼時進行優化。