2014-09-02 82 views
1

以下代碼是如何工作的?函數如何從編譯器尚未達到的表達式調用函數?在達到(function def(...)之前達到def(window)。我在想這個問題的時候出錯了?謝謝。通用模塊定義IIFE模式

var a = 2; 

(function IIFE(def){ 
def(window); 
})(function def(global){ 
var a = 3; 
console.log(a); // 3 
console.log(global.a); // 2 
}); 
+0

「def(window)」在達到「def」函數前沒有達到。用IIFE的第二套圓括號(不包括函數)是參數。在調用'IIFE'函數之前,函數'def'被解析爲'IIFE'函數的參數。所以'IIFE'函數被解析(未被調用),'def'函數參數被解析(未被調用),'def'函數參數被傳遞給'IIFE'函數(現在被調用)和' def(window)'語句被執行(調用'def'函數)。至少這是我對這是如何工作的理解。 – War10ck 2014-09-02 15:35:21

+0

參數*總是先評估*並將結果傳遞給函數。所以在這裏,'function def(global){...}'是一個傳遞給通過'def'訪問參數的函數的參數。 – 2014-09-02 16:02:28

回答

0

def(window) is reached before (function def(...)」 。這不是真的。 defIIFE的一個參數,因此def在窗口中被執行,因爲它是參數,您將得到正確的結果。沒有什麼不尋常的JavaScript。

它幫助,如果您分離出功能:

var a = 2; 

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

function IIFE(def){ 
    def(window); 
} 

IIFE(def); 

http://jsbin.com/jomep/1/edit

0

此代碼是一個小更詳細的比我已經編寫它。即,即使它以匿名方式執行,IIFE函數也被命名。 def函數也是如此 - 即使它有一個名字,它也是匿名使用的。

無論如何,要回答你的問題:IIFE函數的創建與Javascript中的任何其他函數一樣。但是,它立即執行一個參數,這在Javascript中完全有效。該參數是另一個功能。就像任何其他語言一樣,該參數在函數調用站點進行評估。但是,JavaScript也將功能視爲數據。在本例中,功能def在呼叫地點定義,然後輸入到IIFE函數的參數列表中。

編輯:Moog's reformatted answer當然有助於澄清它!