Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在ES6中,使用let时是否重新声明for循环init表达式?_Javascript_For Loop_Scope - Fatal编程技术网

Javascript 在ES6中,使用let时是否重新声明for循环init表达式?

Javascript 在ES6中,使用let时是否重新声明for循环init表达式?,javascript,for-loop,scope,Javascript,For Loop,Scope,我试图澄清MDN这一声明背后的含义 上面的示例按预期工作,因为 (匿名)内部函数指的是 变量i 假设for循环init表达式使用let关键字。表达式是否在每次迭代时重新声明(即,有一个新的作用域)?比如说, var func; for (let i = 0; i < 5; i++) { if (i == 1) { func = () => i } if (i == 4) { i = 100 } } console.log(func()) // outp

我试图澄清MDN这一声明背后的含义

上面的示例按预期工作,因为 (匿名)内部函数指的是 变量i

假设for循环init表达式使用
let
关键字。表达式是否在每次迭代时重新声明(即,有一个新的作用域)?比如说,

var func;
for (let i = 0; i < 5; i++) {
  if (i == 1) {
    func = () => i
  }
  if (i == 4) {
    i = 100
  }
}
console.log(func()) // output is 1
在本例中,似乎只有一个
i
实例在上一次迭代中得到更新(但没有重新声明)


那么,使用
let
是否会导致for循环为每次迭代创建一个新的块作用域,其中包含init变量的新声明?

let
声明的变量的作用域位于最近的块中

在ES6中,还可以通过let和const声明变量。这些变量的作用域是块,它们的作用域是最里面的封闭块。let大致是var的一个块范围版本

这意味着您的代码应该与以下内容等效:

var func;
for (var i = 0; i < 5; i++) {
  (function (j) {
    if (j == 1) {
      func = () => j
    }
    if (j == 4) {
      j = 100
    }
  })(i);
}
console.log(func()) // output is 1
var-func;
对于(变量i=0;i<5;i++){
(职能(j){
如果(j==1){
func=()=>j
}
如果(j==4){
j=100
}
})(i) );
}
console.log(func())//输出为1
部分似乎表明zer00ne提到的是正确的:

  • 循环的每次迭代都会创建一个新的环境
  • 并在该环境中创建了一个新的
    i
    绑定
  • 它的值设置为上一个绑定的值 迭代(而不是重新初始化)
iii让lastValue为lastIterationNV.GetBindingValue(bn,true)

五,。执行此迭代NV.InitializeBinding(bn,lastValue)


在循环中声明的函数将在特定于迭代的绑定上形成闭包-因此有效地,您将为循环的每个迭代获得不同的闭包。

使用
let
声明的变量是块范围的。通过将
i
声明为for循环的一部分,它将成为该循环块的作用域。请参阅:是的,它的作用域是每个迭代。(除了IE,IE没有正确地为
的括号内的声明实现它,尽管它确实为循环体内的声明实现了它。)我相信
let
仅限于循环的范围,因此每次迭代都有一个新的声明,但像闭包一样使用以前的值作为引用。
var func;
for (var i = 0; i < 5; i++) {
  (function (j) {
    if (j == 1) {
      func = () => j
    }
    if (j == 4) {
      j = 100
    }
  })(i);
}
console.log(func()) // output is 1