这有什么意义呢?引擎故障还是什么?
可能的重复:
Javascript 作用域变量理论
大家好,
我想问一些奇怪的问题。这是代码。
var a = "defined"; function f() { alert(a); var a = 5; } f();
警报“未定义”
任何人都可以解释为什么我得到“未定义”。
法提赫..
Possible Duplicate:
Javascript scoping variables theory
Hi all,
I want to ask something stranger. Here is the code.
var a = "defined"; function f() { alert(a); var a = 5; } f();
alerts "undefined"
Can anyone explain that why I am getting "undefined".
Fatih..
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我想这就是所谓的JavaScript Hoisting。观看此视频以了解有关该问题的更多信息及其解决方案:
http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-javascript-hoisting-explained/
要使其正常工作,您必须删除
var
关键字形式变量a
:所以基本上,这是一个变量范围问题。删除
var
关键字的行为使变量全局可用。因此,这次没有出现错误。That is called JavaScript Hoisting i suppose. Check out this video to learn more about it and solution to it:
http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-javascript-hoisting-explained/
To make it work, you will have to remove the
var
keyword form variablea
:So basically, it is a variable scope issue. The act of removing
var
keyword makes a variable globally available. Hence, there is no error raised this time.在函数中你会得到一个新的范围。
函数中的
var a
声明了一个局部变量a
,它屏蔽了全局变量。对
a
的赋值稍后发生(在警报之后),因此在此之前a
是未定义的。令人困惑的部分是,如果您在函数顶部或函数中的其他任何位置(甚至可以在 if 内部)声明 var a ,这并不重要。效果是相同的:它为该范围声明一个变量(即使对于位于声明之前的代码也有效)。这就是为什么 jslint 建议在顶部声明所有局部变量。
In the function you get a new scope.
The
var a
in the function declares a local variablea
, which masks the global one.The assignment to
a
takes place later (after the alert), so until thena
is undefined.The confusing part is that it does not matter if you have the
var a
declaration on top or anywhere else in the function (can even be inside an if). The effect is the same: It declares a variable for that scope (effective even for code that is located before the declaration). That is why jslint recommends to declare all local variables on top.