这是什么意思?引擎bug还是什么?

时间:2011-01-12 08:54:02

标签: javascript variables global-variables var

  

可能重复:
  Javascript scoping variables theory

大家好,

我想问一些陌生人。这是代码。

var a = "defined";
function f() {
   alert(a);
   var a = 5;
}
f();

警告“未定义”

任何人都可以解释为什么我会“未定义”。

法提赫..

2 个答案:

答案 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建议在顶部声明所有局部变量。