大家好,
我想问一些陌生人。这是代码。
var a = "defined"; function f() { alert(a); var a = 5; } f();
警告“未定义”
任何人都可以解释为什么我会“未定义”。
法提赫..
答案 0 :(得分:2)
我认为这叫做 JavaScript Hoisting 。观看此视频,了解有关它的更多信息及解决方案:
http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-javascript-hoisting-explained/
要使其有效,您必须删除var
关键字表单变量a
:
var a = "defined";
function f() {
alert(a);
a = 5;
}
f();
基本上,这是一个可变范围问题。删除var
关键字的行为会使变量全局可用。因此,这次没有引起任何错误。
答案 1 :(得分:0)
在该功能中,您将获得一个新范围。
函数中的var a
声明了一个局部变量a
,它掩盖了全局变量。
a
的分配发生在稍后(警报之后),因此在此之前a
未定义。
令人困惑的部分是,如果你在函数的顶部或其他任何地方都有var a
声明并不重要(甚至可以在if中)。效果是相同的:它声明了该范围的变量(即使对于位于声明之前的代码也是有效的)。这就是为什么jslint建议在顶部声明所有局部变量。