var a = 2;
(function foo() )();
console.log( a ); // 2
由於函式被包含在一對 ( ) 括號內部,因此成為了乙個表示式,通過在末尾加上另外乙個
( ) 可以立即執行這個函式,比如 (function foo())() 。第乙個 ( ) 將函式變成表
達式,第二個 ( ) 執行了這個函式。
這種模式很常見,幾年前社群給它規定了乙個術語:iife,代表立即執行函式表示式
(immediately invoked function expression);
相較於傳統的 iife 形式,很多人都更喜歡另乙個改進的形式: (function()()) 。仔
細觀察其中的區別。第一種形式中函式表示式被包含在 ( ) 中,然後在後面用另乙個 () 括
號來呼叫。第二種形式中用來呼叫的 () 括號被移進了用來包裝的 ( ) 括號中。
例如:
var a = 2;
(function iife( global ) )( window );
console.log( a ); // 2
我們將 window 物件的引用傳遞進去,但將引數命名為 global ,因此在**風格上對全域性
物件的引用變得比引用乙個沒有「全域性」字樣的變數更加清晰。當然可以從外部作用域傳
遞任何你需要的東西,並將變數命名為任何你覺得合適的名字。這對於改進**風格是非
常有幫助的。
這個模式的另外乙個應用場景是解決 undefined 識別符號的預設值被錯誤覆蓋導致的異常(雖
然不常見)。將乙個引數命名為 undefined ,但是在對應的位置不傳入任何值,這樣就可以
保證在**塊中 undefined 識別符號的值真的是 undefined :
undefined = true; // 給其他**挖了乙個大坑!絕對不要這樣做!
(function iife( undefined )
})();
iife 還有一種變化的用途是倒置**的執行順序,將需要執行的函式放在第二位,在 iife
執行之後當作引數傳遞進去。這種模式在 umd(universal module definition)專案中被廣
除了 let 以外,es6 還引入了 const ,同樣可以用來建立塊作用域變數,但其值是固定的
(常量)。之後任何試圖修改值的操作都會引起錯誤。
var foo = true;
if (foo)
console.log( a ); // 3
console.log( b ); // referenceerror!
JS自執行函式
函式表示式立即執行 函式宣告想要立即執行,會報錯 按照上面的分析,我們如果在第乙個 前面加上函式名稱,在第二個 裡面加入表示式,那麼就不會報錯了,我們來看一下效果 改掉語法錯誤以後的函式宣告 可以看到修改了那兩處的問題以後,報錯消失了,但是這個時候函式並沒有執行,原因上面也已經提到了,就是一旦被當作...
js自執行函式
方式1 最前最後加括號 function 方式2 function外面加括號 function 方式3 function前面加運算子 function 注 1 可以給立即執行函式傳遞引數 2 立即函式內部是可以訪問外部變數 3 立即執行函式模式被廣泛使用,它可以幫你封裝大量的工作而不會在背後遺留任何...
自執行函式和匿名函式
所謂匿名函式就是沒有名字的函式,形式如下 function 既然沒有名字,那麼如何呼叫呢 var b function b 可以將匿名函式付給乙個變數,這個變數現在就充當了這個函式的名稱,但是記住,這個不是名稱,我只是這麼叫,如果覺得不妥的話,可以認為b現在就是這個匿名函式的代表,在用的時候用b就等...