【问题标题】:Redefining a variable in a loop does not make it undefined在循环中重新定义变量不会使其未定义
【发布时间】:2016-01-14 05:49:43
【问题描述】:

有以下for循环:

for (var i = 0; i < 3; ++i) {
    console.log(i, p);
    var p;
    p = 42;
}

我期待的输出是:

0 undefined
0 undefined
0 undefined

但实际上,输出是:

0 undefined
0 42
0 42

既然我们在下一行使用var p(重新声明p),为什么console.log 行中没有p 未定义(始终)?

【问题讨论】:

  • stackoverflow.com/questions/500431/…, there is no such thing as block level scope in js.
  • @Bharadwaj 实际上,在 ES6 中我们有 let
  • @IonicăBizău 是的,OP 套件给出的示例是该答案的一部分。
  • 您是出于好奇而问这个吗?如果您按照最可能应该的方式在顶部声明变量,那么与提升相关的问题就不会成为问题。通过使用调试器单步执行您的代码,可以很容易地分析这个特定问题。在“执行”第二个var p; 之后,您会注意到p 的值没有改变。

标签: javascript loops for-loop redeclaration


【解决方案1】:

由于variable hoisting 和您的变量是函数作用域而不是块作用域。

你的 for 循环被翻译成

var p;
for (var i = 0; i < 3; ++i) {
    console.log(i, p);
    p = 42;
}

表示第一次访问p是undefined

下次它已经在当前函数范围内初始化,所以它会保持初始化值。

【讨论】:

  • @IonicăBizău 明白了! w3schools -> 糟糕 :) 我认为这足以解释这一点
  • 实际上,不完全是。 var p; 被提升高于 for 循环(到它所在的任何函数的顶部)。
  • @torazaburo 明白了你的意思。更新了答案,感谢您不反对:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多