我找不到与我的问题完全匹配,但确实存在许多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 :(得分: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/