Javascript 在ES6中,使用let时是否重新声明for循环init表达式?
我试图澄清MDN这一声明背后的含义 上面的示例按预期工作,因为 (匿名)内部函数指的是 变量i 假设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
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
- 它的值设置为上一个绑定的值 迭代(而不是重新初始化)
在循环中声明的函数将在特定于迭代的绑定上形成闭包-因此有效地,您将为循环的每个迭代获得不同的闭包。使用
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