可能重复:
Javascript 作用域变量理论
大家好,
我想问一些陌生的东西。这是代码。
var a = "已定义"; 函数 f() { 警报(一); 变量 a = 5; } F();
警报“未定义”
任何人都可以解释为什么我得到“未定义”。
法蒂赫..
可能重复:
Javascript 作用域变量理论
大家好,
我想问一些陌生的东西。这是代码。
var a = "已定义"; 函数 f() { 警报(一); 变量 a = 5; } F();
警报“未定义”
任何人都可以解释为什么我得到“未定义”。
法蒂赫..
我想这就是所谓的JavaScript 提升。观看此视频以了解有关它的更多信息及其解决方案:
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
关键字的行为使变量全局可用。因此,这次没有引发错误。
在函数中,您将获得一个新范围。
函数中的var a
声明了一个局部变量a
,它掩盖了全局变量。
to 的分配a
稍后发生(在警报之后),因此在此之前a
是未定义的。
var a
令人困惑的部分是,如果您在函数的顶部或其他任何地方(甚至可以在 if 中)有声明,这并不重要。效果是一样的:它为该范围声明了一个变量(即使对于位于声明之前的代码也有效)。这就是为什么 jslint 建议在顶部声明所有局部变量的原因。