3 回答
TA贡献1810条经验 获得超4个赞
quin着眼睛的答案不再是最新的。在ECMA 6规范中,指定的行为是
for(let i;;){}
i 在循环的每次迭代中获取一个新的绑定。
这意味着每个闭包都捕获一个不同的i实例。因此,截至目前的结果012是正确的结果。在Chrome v47 +中运行此程序时,您将获得正确的结果。在IE11和Edge中运行它时,当前333似乎会产生不正确的结果()。
有关此错误/功能的更多信息,请参见本页中的链接;
由于使用let表达式时,每次迭代都会创建一个新的词汇作用域,该作用域链接到先前的作用域。这对于使用该let表达式有性能影响,在此处进行了报道。
TA贡献1900条经验 获得超5个赞
恕我直言-最初实施此LET(产生初始版本的结果)的程序员在理智方面做得正确;他们可能没有在实施过程中浏览过规格。
使用单个变量更有意义,但范围仅限于for循环。特别是因为应该根据循环中的条件随意更改该变量。
但是,等等-您可以更改循环变量。WTFJS !!但是,如果您尝试在内部作用域中对其进行更改,则由于它是一个新变量,因此现在将无法使用。
我不喜欢要做的事情以获得想要的东西(对于for是局部的单个变量):
{
let x = 0;
for (; x < length; x++)
{
things["fun" + x] = function() {
console.log(x);
};
}
}
在何处修改更直观(如果是虚构的)版本以在每次迭代中处理新变量:
for (let x = 0; x < length; x++)
{
let y = x;
things["fun" + y] = function() {
console.log(y);
};
}
显而易见,我对y变量的意图是什么。或者如果SANITY统治了宇宙,那将是我的意图。
因此,您的第一个示例现在可以在FF中使用;它会产生0、1、2。您可以解决此问题。我称这个问题为WTFJS。
ps。我对WTFJS的引用来自上面的JoeyTwiddle;这听起来像是我今天之前应该知道的一个模因,但是今天是学习它的好时机。
添加回答
举报