【问题标题】:Re-declaration of block scoped loop variable inside the loop在循环内重新声明块范围的循环变量
【发布时间】:2020-08-18 16:47:48
【问题描述】:

我最近遇到了一段代码,它让我对在循环中使用 let 关键字声明的块范围变量感到困惑。

考虑以下代码sn-p:

for (let i = 0; i < 10; i++) {
  let i = 'hello';
  console.log(i);
}

变量i 的重新声明在这里如何工作?不过,我不能在同一范围内重新声明块范围的变量。

【问题讨论】:

  • 范围不一样。每次迭代的范围不同。
  • @Taplar 是的,我知道,但据我所知,我们不应该在循环内重新声明 i
  • 如果是不同的范围,如何重新声明?你忽略了你刚刚同意的前提。
  • 这是一个不同的范围。您是在寻找带有规范引用的答案,还是……?
  • @Ry- 我知道循环的每次迭代都有不同的范围。我想,我很困惑for (let i = 0; i &lt; 10; i++) 中声明的i 变量是否声明在与循环体内的不同范围内?

标签: javascript


【解决方案1】:

为什么

for(let fn = () => run; fn();) {
  let run = false;
}

不工作?因为每个循环迭代都有自己的范围,那么声明中的run 将引用哪个范围?为了防止这种情况发生,for 标头中的声明在它们自己的范围内。因此,您不能从头部的主体中访问变量,并且作为副作用,可以在主体中重新声明变量。这是在13.7.4.8 中指定的。

【讨论】:

  • 规范中关于 for 循环的复杂声明内容有不同的目的。并不是说我真的知道更好的方法来回答这个问题……“我 [认为] 你不能在同一范围内重新声明块范围的变量”->“是的”?
  • 我不确定您想通过问题中的代码示例告诉我什么。由于时间死区,第一个不起作用。虽然,你答案的最后一行 - 每个声明都在它自己的范围内,for 循环的主体也有它自己的 - 已经消除了我的困惑。
  • @Yousaf 呃,实际上我把它和function parameter initialization 混在一起了,在根据这个错误的假设给出答案之前应该检查一下规范。已编辑。
【解决方案2】:

我们可以在这里看到let 的定义...

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

let 语句声明了一个块范围的局部变量。

for (let i = 0; i < 10; i++) {
    //blah blah blah
    let i = 'Hello'
}

我认为这等于do-while循环

let i = 0
do {
    // blah blah blah
    let i = 'Hello'
} while(i ++ < 10);

如果我们回到 let 的定义,这很清楚,因为 let 语句是块作用域的。

希望这有助于解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 2016-10-22
    • 2014-06-15
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    相关资源
    最近更新 更多