gpt4 book ai didi

javascript - for、for-in、for-of循环中变量作用域规则不一致

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:20:51 25 4
gpt4 key购买 nike

所以我注意到我必须在 for 循环中使用 let,而不能使用 const。但是,我发现我可以在 for-infor-of 结构中使用 const(下面的代码)。凭直觉,我可以合理化这是因为 for 循环的实现方式不同/更原始,而其他构造将 desugar 转换为 for 循环,其中迭代变量被分配在 for 循环的顶部。

// Doesn't work
for (const i = 0; i < 3; i++) {
console.log(i);
}

// Works
for (let i = 0; i < 3; i++) {
console.log(i);
}

// Works
const object2 = ['a', 'b', 'c'];
for (const v of object2) {
console.log(v);
}

// Works
const object3 = {
a: 'a',
b: 'b',
c: 'c',
};
for (const v in object3) {
console.log(v);
}

我在 Mozilla MDN 上唯一能找到的是关于 for循环页面:

This expression may optionally declare new variables with the var keyword. These variables are not local to the loop, i.e. they are in the same scope the for loop is in. The result of this expression is discarded.

这似乎也是错误的,因为如果我们为 i 使用 let 那么 i 就不再在 for 之后的范围内 循环(与其他语言一致)

for (let i = 0; i < 3; i++) {
console.log(i);
}
// Doesn't work as expected
console.log(i);

我的问题是这种行为是否在规范中的某个地方被预期和定义? MDN 对此没有多说。

最佳答案

是的。这确实是预期的行为。

const 定义了一个变量,顾名思义,它保持不变。这意味着 const 的值不能改变。

现在您在 for 循环中所做的是递增“i”,它被定义为常量。

for (const i = 0; i < 3; i++ /* <- this doesn't work */ ) {
console.log(i);
}

使用 for .. infor .. of 但是,您只需绑定(bind)变量。

换句话说:对于 for .. in/off,变量在循环执行之前分配一次,而不是在每次迭代时分配一次。因此const确实可以使用。

至于引用:

ForDeclaration : LetOrConst ForBinding

http://www.ecma-international.org/ecma-262/6.0/index.html#sec-for-in-and-for-of-statements-static-semantics-boundnames

关于javascript - for、for-in、for-of循环中变量作用域规则不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49573227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com