自執行匿名函式(
self-executing anonymous function)和立即執行的函式表示式(
immediately-invoked function expressio)區別
// 這是乙個
自執行的函式
,函式內部執行自身,遞迴
function
foo()
// 這是乙個
自執行的匿名函式
,因為沒有標示名稱
// 必須使用arguments.callee屬性來執行自己
varfoo =
function
() ;
arguments.callee:
else
} 定義階乘函式一般都要用到遞迴演算法;如上面的**所示,在函式有名字,而且名字以後也不會變的情況下,這樣定義沒有問題。但問題是這個函式的執行與函式名
foo緊緊耦合在了一起。為了消除這種緊密耦合的現象,可以像下面這樣使用arguments.callee
function
foo(num)
else
}
現在已經不推薦使用arguments.callee();原因
:訪問 arguments 是個很昂貴的操作,因 為它是個很大的物件,每次遞迴呼叫時都需要重新建立。影響現代瀏覽器的效能,還會影響閉包。 }
// 這可能也是乙個
自執行的匿名函式
,僅僅是foo標示名稱引用它自身
// 如果你將foo改變成其它的,你將得到乙個used-to-self-execute匿名函式
varfoo =
function
() ;
// 有些人叫這個是
自執行的匿名函式
(即便它不是),因為它沒有呼叫自身,它只是
立即執行
而已。(
function
() ());
// 為函式表示式新增乙個標示名稱,可以方便debug
// 但一定命名了,這個函式就不再是匿名的了
(function
foo() ());
// 立即呼叫的函式表示式
也可以自執行,不過可能不常用罷了
(function
() ());
(function
foo() ());
問題的核心
當你宣告類似function foo(){}或var foo = function(){}函式的時候,通過在後面加個括弧就可以實現自執行,例如foo(),看**:
// 因為想下面第乙個宣告的function可以在後面加乙個括弧()就可以自己執行了,比如foo(),
// 因為foo僅僅是function() 這個表示式的乙個引用
varfoo =
function
() // ...是不是意味著後面加個括弧都可以自動執行?// syntaxerror: unexpected token
function
()();
上述**,如果甚至執行,第2個**會出錯,因為在解析器解析全域性的function或者function內部function關鍵字的時候,
預設是認為function宣告,而不是function表示式
,如果你不
顯示告訴編譯器
,它缺省會宣告成乙個缺少名字的function,並且丟擲乙個語法錯誤資訊,
因為function宣告需要乙個名字。
有趣的是,即便你為上面那個錯誤的**加上乙個名字,他也會提示語法錯誤,只不過和上面的原因不一樣。在乙個表示式後面加上括號(),該表示式會立即執行,但是在乙個語句後面加上括號(),是完全不一樣的意思,他的只是分組操作符。
// 下面這個function在語法上是沒問題的,但是依然只是乙個語句
// 加上括號()以後依然會報錯,因為分組操作符需要包含表示式
function
foo()();
// syntaxerror: unexpected token )
// 但是如果你在括弧()裡傳入乙個表示式,將不會有異常丟擲
// 但是foo函式依然不會執行
function
foo()( 1 );
// 因為它完全等價於下面這個**,乙個function宣告後面,又宣告了乙個毫無關係的表示式:
function
foo()
( 1 );
立即執行函式表示式 自執行函式
立即執行函式表示式,大部分人也稱為自執行函式。匿名函式 function 具名函式 function log 自執行函式的傳參 function add a,b 1,2 返回值let fn function add a,b 2,4 console.log fn 自執行函式也可以傳遞函式作為引數var...
IIFE 立即執行函式表示式
原文 iife 的原理,我簡單說一下 function foo 這是定義,declaration 定義只是讓直譯器知道其存在,但是不會執行。foo 這是語句,statement 直譯器遇到語句是會執行它的。iife 並非必須,傳統一點可以這麼寫 function foo foo 那麼為什麼要 iif...
立即執行函式表示式IIFE
一 iife解釋 全拼imdiately invoked function expression,立即執行的函式表示式。像如下的 所示,就是乙個匿名立即執行函式 function window,undefined window 二 括號的意義 2.1 包住function 的括號的意義 這個括號的目...