【问题标题】:What is the mean of this? Engine bug or what? [duplicate]这是什么意思?引擎错误还是什么? [复制]
【发布时间】:2011-01-12 08:54:02
【问题描述】:

可能重复:
Javascript scoping variables theory

大家好,

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

var a = "已定义"; 函数 f() { 警报(一); 变量 a = 5; } F();

警报“未定义”

谁能解释我为什么会“未定义”。

法蒂赫..

【问题讨论】:

标签: javascript variables global-variables var


【解决方案1】:

我想这叫做 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 也可能不会做你想做的事,因为现在你正在搞乱全局变量。 (不过这并不令人惊讶)。
  • 有趣。这是我不知道的事情,我很惊讶它还没有让我发现。感谢您的链接。
【解决方案2】:

在函数中你会得到一个新的作用域。

函数中的var a声明了一个局部变量a,它屏蔽了全局变量。

a 的分配发生在稍后(在警报之后),因此在此之前a 是未定义的。

令人困惑的部分是,您是否在顶部或函数中的任何其他位置(甚至可以在 if 内)有 var a 声明并不重要。效果是一样的:它为该范围声明了一个变量(即使对于位于声明之前的代码也有效)。这就是为什么 jslint 建议在顶部声明所有局部变量的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-05
    • 2016-03-24
    • 2015-03-12
    • 1970-01-01
    • 2012-11-18
    相关资源
    最近更新 更多