虽然x不是常量,但以下代码如何运行且没有任何错误?
for (const x of [1,2,3]){
console.log(x);
}
答案 0 :(得分:6)
它适用于Chrome等兼容浏览器,因为它们会在每次迭代时创建一个新的,不同的常量变量:
var arr = [];
for (const x of [1,2,3])
arr.push(() => x);
arr.map(f => f()); // [1,2,3] on Chrome
一些不兼容的浏览器会重复使用相同的变量:
var arr = [];
for (let x of [1,2,3])
arr.push(() => x);
arr.map(f => f()); // [3,3,3] on non-compliant browsers
因此,如果在上面的示例中使用const
,则会抛出错误。
Runtime Semantics: ForIn/OfBodyEvaluation说:
- 重复
醇>
- 否则
- 断言: lhsKind 是lexicalBinding。
- 断言: lhs 是 ForDeclaration 。
- 让 iterationEnv 为NewDeclarativeEnvironment( oldEnv )。
- 为 lhs 执行BindingInstantiation传递 iterationEnv 作为参数。
因此每次迭代都应该创建一个新的绑定。 Chrome是正确的。