您的第二个示例绝对不应该工作,因为i
仅声明一次,而不是在每次迭代时声明这仅是该类循环工作方式的函数。
您可以在常规浏览器中尝试以下操作:
for (var i = 0, otherVar = ""; i < [1,2,3,4].length; i += 1){
console.log(otherVar)
otherVar = "If otherVar was initialized on each iteration, then you would never read me.";
}
循环中const
完全不允许的情况并非如此for
。只有for
这样才能修改const。
这些是有效的:
for(const i = 0;;){ break }
for(const i = 0; i < 10;){ break; }
这些是无效的:
for(const i = 0;;){ ++i; break; }
for(const i = 0;;++i){ if(i > 0) break; }
我不确定为什么Firefox在阅读ES2015规范后会给出SyntaxError(尽管我确定Mozilla的聪明人是正确的),但似乎应该引发异常:
在环境记录中创建一个新的但未初始化的不可变绑定。字符串值N是绑定名称的文本。如果S为true,则无论在引用该绑定的操作的严格模式设置如何的情况下,尝试在其初始化之前访问绑定的值或在其初始化之后对其进行设置都将始终引发异常。S是可选参数,默认为false。