javascript - 当我使用 let 声明时,初始化区域中语句的语义

标签 javascript ecmascript-6

<分区>

我知道当我在循环中声明一个 let 变量时,该变量在每个循环中都被声明。例如:

for(let i=0 ; i<3 ; i++)
{
    let x=1;
}

变量 x 声明了 3 次,即在内存中为循环中的每个变量分配了三个不同的位置。

但是变量 i 发生了什么?是声明一次吗? 还是只初始化了一次却又声明了三次?

我想了解幕后发生的事情。

最佳答案

使用 let 时,i 被声明一次,并在每个循环中获得一个新的绑定(bind)。并且其范围仅在 block 语句内部可见。

从这里Variables and scoping in ECMAScript 6 :

let in loop heads

In loops, you get a fresh binding for each iteration if you let-declare a variable. The loops that allow you to do so are: for, for-in and for-of.

for (let i = 0; i < 3; i++) {
    let x = 1;
    setTimeout(() => console.log(i), 1000);
}

另一个带有赋值的示例,用于重新绑定(bind)。

for (let x = { v: 0 }; x.v < 2; x.v += 1) {
    setTimeout(() => console.log(x), 100); // same values
}

for (let x = { v: 0 }; x.v < 2; x = { v: x.v + 1}) {
    setTimeout(() => console.log(x), 100); // different values
}
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 当我使用 let 声明时,初始化区域中语句的语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59967000/

相关文章:

javascript - 重构对象数组

javascript - 使用 vscode 时是否应该为 es6 项目提交 typings 文件夹?

javascript - '不支持 ES 模块的 require()。 ' Node.js、express、swagger-jsdoc 出错

javascript - AngularJS 绑定(bind)到 WebGL/Canvas

Javascript:对象和函数...有人可以解释为什么这不起作用吗?

javascript - React Router v4 - 嵌套路由问题

javascript - 如何在 JavaScript 中使函数参数保持不变?

javascript - 在 Promise 中使用 await

javascript - 用 Javascript 或 jQuery 替换甚至更好地删除内联样式?

javascript - 如何使用 jQuery(或 js)禁用非输入元素?