考虑以下代码片段
var a = [1, 2, 3, 4];
for (a of a) { // The first 'a' is made by mistake
console.log(a);
}
在 for
循环中,第一个 a
是因为错误而被写入的。我认为上述代码应该会出现错误,因为在第一次迭代中将 a
赋值为 1
后,再次迭代时 a
不是一个可迭代对象,因此应该抛出错误。
实际上,结果如下:
1
2
3
4
看起来上面的代码可以正确遍历数组。在 for
循环之后,a
的结果是 4
。为什么呢?
> a
4
为了进一步研究,我尝试从ECMA-6文档
中找到一些信息,但是我被以下语句所困惑。
for ( var ForBinding of AssignmentExpression ) Statement
for ( ForDeclaration of AssignmentExpression ) Statement
为了理解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)
之间有什么区别?
var
声明的变量不会被重新声明。在其作用域中,声明会被提升,且代码中稍后遇到的var
会被 _忽略_。 - Teemuvar a
版本,那么循环前后a
的含义仍然相同,但由于变量提升可能会遮蔽外部作用域的变量(因此完全改变你正在迭代的内容)”。 - Alexei Levenkov