Javascript范围混乱

时间:2011-10-03 15:40:42

标签: 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中都看到了这种行为。

3 个答案:

答案 0 :(得分:7)

所有var语句都被有效地“提升”到其封闭函数的顶部(某种程度)。因此,你在该函数中有var my_var 任何地方这一事实意味着所有提到的“my_var”都引用了局部变量。

(我说“有点”因为var语句的赋值部分没有移位;只是声明标识符应该是局部变量。)

答案 1 :(得分:3)

原因是因为声明在JavaScript中的函数范围内被提升。阅读更多相关信息here

答案 2 :(得分:1)

Javascript变量具有函数作用域,与C,C ++,Java和C#不同,它们具有块作用域(大括号)。

快速提示:JavaScript提升解释

http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-javascript-hoisting-explained/