请考虑以下代码段
var a = [1, 2, 3, 4];
for (a of a) { // The first 'a' is made by mistake
console.log(a);
}
首先 a
在里面 for
循环是错误写的。我认为上面的代码应该运行错误,因为什么时候 a
分配给 1
然后在第一次迭代中 a
不是 可迭代的对象。所以在下一次迭代中应该抛出一个错误。
实际上,结果如下:
1
2
3
4
看来上面的代码可以正确地迭代数组。之后 for
循环,结果 a
是 4
。 为什么?
> a
4
为了进一步调查,我试图从中找到一些信息 ECMA-6 doc
,但我对以下声明感到困惑。
for(var ForBinding of AssignmentExpression)语句
for(ForDeccration of AssignmentExpression)声明
要理解 ForBinding
和 ForDeclaration
,测试以下代码。
var a = [1, 2, 3, 4];
for (var a of a) {
console.log(a);
}
console.log(a);
不幸的是,结果与之前的代码相同。有什么区别 for (var a in a)
和 for (a in a)
?
for
评估“AssignmentExpression”的值并迭代它。该值仅在迭代开始时获得一次,因此重用相同的变量是完全有效的(也非常令人困惑)。
存在 var
: for (a of ...)
和 for (var a of ...)
没有做任何 1 你已经拥有的代码差异 a
定义 - 所以它只会重新声明相同的变量。
要完全准确,有些行为是不同的 - 何时 a
在当前函数的外部范围内声明 var
版本将影响该值(如在JavaScript中所有 var
语句被提升到函数范围的顶部):
var a = [1,2,3];
function tryForVar() {
// Note that declaration of `a` is hoisted here as var a = undefined;
// for (var a ... does not work as expected as local 'a' is undefined
for (var a of a) {
console.log(a); // log 'undefined' once
}
console.log(a); // undefined
}
tryForVar();
console.log(a); // [1,2,3]
function tryFor() {
// Note that declaration of `a` from outer scope
// for (a ... works fine as it uses outer 'a'
for (a of a) {
console.log(a); // logs all 1,2,3 in sequence
}
console.log(a); // 3
}
tryFor();
console.log(a); // 3
for
评估“AssignmentExpression”的值并迭代它。该值仅在迭代开始时获得一次,因此重用相同的变量是完全有效的(也非常令人困惑)。
存在 var
: for (a of ...)
和 for (var a of ...)
没有做任何 1 你已经拥有的代码差异 a
定义 - 所以它只会重新声明相同的变量。
要完全准确,有些行为是不同的 - 何时 a
在当前函数的外部范围内声明 var
版本将影响该值(如在JavaScript中所有 var
语句被提升到函数范围的顶部):
var a = [1,2,3];
function tryForVar() {
// Note that declaration of `a` is hoisted here as var a = undefined;
// for (var a ... does not work as expected as local 'a' is undefined
for (var a of a) {
console.log(a); // log 'undefined' once
}
console.log(a); // undefined
}
tryForVar();
console.log(a); // [1,2,3]
function tryFor() {
// Note that declaration of `a` from outer scope
// for (a ... works fine as it uses outer 'a'
for (a of a) {
console.log(a); // logs all 1,2,3 in sequence
}
console.log(a); // 3
}
tryFor();
console.log(a); // 3