2011-10-03 199 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