2011-10-03 198 views
5

雖然很多JavaScript範圍問題確實存在,但我無法在我的問題上找到完全匹配。這是我現在的問題代碼。Javascript範圍混亂

var my_var = "blank"; 
var MyFunc = function() { 
    my_var = "one"; 
    //var my_var = "two"; 
} 
alert(my_var); 
MyFunc(); 
alert(my_var); 

當我運行此,我提醒與「空白」,然後如預期「一」。但是,如果我取消註釋該行,則看起來像這樣。

var my_var = "blank"; 
var MyFunc = function() { 
    my_var = "one"; 
    var my_var = "two"; 
} 
alert(my_var); 
MyFunc(); 
alert(my_var); 

我提醒與「空白」然後「空白」。這不是我所期望的,我發現添加一行可以消除行爲,令人困惑。任何人都可以解釋這裏發生了什麼?我在firefox和safari中都看到了這種行爲。

+0

另一個很好的理由。 – jfriend00

回答

7

所有的var語句被有效地「懸掛」到它們的封閉函數(排序)的頂部。因此,您在該函數中的任何地方都有var my_var這一事實意味着所有提及的「my_var」都指向局部變量。

(我說「之類的」,因爲var語句的賦值部分不移動,只是聲明的標識應該是一個局部變量)。

+0

文檔?除了這個例子之外,什麼證明了這一點? – Neal

+0

完成你的句子。提升使得'my_var'成爲整個函數中的局部變量。 – jfriend00

+0

該規範使其非常清楚。第12.2節。規範談到變量被「創造」,這就是「提升」部分。 – Pointy

3

的原因是因爲聲明內懸掛函數在JavaScript中的作用域。詳細瞭解它here