2011-02-09 126 views
4

這裏有一個基本的問題。我可以看到發生了什麼,但我無法真正理解爲什麼它會以這種方式工作。JavaScript:初始化函數中的變量

a = false; 
var k = function() { 
    console.log(a); 
    var a = true 
    console.log(a); 
}(); 

我希望日誌以閱讀「假的,那麼真正的」,而是「一個」未定義在第一。有人可以詳細說明它爲什麼這樣做。

Ps。我不是在尋找答案,告訴我該怎麼做,我正在尋找關於這段JavaScript內部工作原理的解釋。

在此先感謝

回答

10

這是因爲使用Javascript作用域的工作方式是所謂的「吊裝」。當解析器讀取一個Javascript函數時,它會經過並找到在該範圍內定義的所有變量(使用var)關鍵字(請記住,JavaScript中唯一的範圍類型是函數作用域)。然後它將它們放在函數的頂部。

所以解析器解釋你的代碼如下:

a = false; 
var k = (function() { 
    var a; 
    console.log(a); 
    a = true 
    console.log(a); 
}()); 

(注:我已經糾正你的函數調用,以便它不會返回一個語法錯誤。)

這顯然現在設置aundefined,然後再執行第一個console.log


As the MDC docs say

變量的每一個定義是真的在其範圍頂端的變量聲明,並在這裏的定義是地方的分配。

+0

Aaah ..擡頭......我真的在想它,但是你打敗了我這個答案...... + 1 – 2011-02-09 09:43:56