2012-01-24 23 views
1

可能重複:
Why does second function declaration win even though I return before it?JS如何使用其代碼?

我想明白了一兩件事。在實現任何函數或輸出之前,JS是否首先通過代碼來初始化變量,函數等?我的意思是它看起來像遍歷代碼兩次 - 一次初始化,只有第二次它開始做某事。對?

我有這樣的代碼:

alert((function f() { 
    function f() { return 1 } 

    return f(); 

    function f() { return 2 } 
})()); 

輸出爲2。所以,如果它開始從第一次正確的實現代碼,輸出將爲1.但是,就輸出爲二首檢查代碼,然後纔開始使用它。我對嗎?

回答

4

Javascript確實「懸掛」。這基本上意味着任何var namefunction name()被懸掛在它聲明的任何函數體的頂部。因此,您的示例可以像這樣重寫,它遵從提升規則。

var f; 
f = function() { 
    var f; 
    f = function() { return 1; }; 
    f = function() { return 2; }; // hoisted! 
    return f(); 
}; 
alert(f()); 

這裏發生的事情是,在外部範圍,你犯了一個局部變量f。然後給它分配一個函數,然後執行該函數。

裏面的函數,我們創建一個新的局部變量f,其中陰影外面的一個,使得它無法訪問。我們現在有一個完全不同的f,只存在於這個內部函數中。我們給它分配第一個功能,然後分配第二個升起的功能。現在我們執行我們的函數體。

因此,您幾乎從不想使用function name() {}語法來創建函數,因爲它們是懸掛的。而是使用var name = function() {}來創建函數。

它更具可控性和可理解性,因爲聲明變量併爲其分配值現在是2個單獨的操作。變量聲明仍然存在,但是直到到達爲其分配函數的代碼行時纔會有值,這通常是您實際需要的。

1

varfunction都被首先處理。這是我定義我的功能爲
f = function()而不是function f()的主要原因 - 這種方式我確切地知道什麼是定義在哪裏。

+0

「* var和function都被首先處理。」 - 這應該在更詳細的解釋中進行解釋... –