猿问

for循环中的let关键字

ECMAScript 6 let应该提供块范围,而不会引起麻烦。有人可以解释为什么在i函数下面的代码中,解析为循环中的最后一个值(与一样var),而不是当前迭代中的值吗?


"use strict";

var things = {};

for (let i = 0; i < 3; i++) {

    things["fun" + i] = function() {

        console.log(i);

    };

}


things["fun0"](); // prints 3

things["fun1"](); // prints 3

things["fun2"](); // prints 3

根据MDNlet在这样的for循环中使用,应该将变量绑定在循环主体的范围内。当我在块中使用临时变量时,事情按预期运行。为什么有必要?


"use strict";

var things = {};

for (let i = 0; i < 3; i++) {

    let index = i;

    things["fun" + i] = function() {

        console.log(index);

    };

}


things["fun0"](); // prints 0

things["fun1"](); // prints 1

things["fun2"](); // prints 2

我使用Traceur和来测试了脚本node --harmony。


慕哥9229398
浏览 730回答 3
3回答

蝴蝶不菲

quin着眼睛的答案不再是最新的。在ECMA 6规范中,指定的行为是for(let i;;){}i 在循环的每次迭代中获取一个新的绑定。这意味着每个闭包都捕获一个不同的i实例。因此,截至目前的结果012是正确的结果。在Chrome v47 +中运行此程序时,您将获得正确的结果。在IE11和Edge中运行它时,当前333似乎会产生不正确的结果()。有关此错误/功能的更多信息,请参见本页中的链接;由于使用let表达式时,每次迭代都会创建一个新的词汇作用域,该作用域链接到先前的作用域。这对于使用该let表达式有性能影响,在此处进行了报道。

梵蒂冈之花

恕我直言-最初实施此LET(产生初始版本的结果)的程序员在理智方面做得正确;他们可能没有在实施过程中浏览过规格。使用单个变量更有意义,但范围仅限于for循环。特别是因为应该根据循环中的条件随意更改该变量。但是,等等-您可以更改循环变量。WTFJS !!但是,如果您尝试在内部作用域中对其进行更改,则由于它是一个新变量,因此现在将无法使用。我不喜欢要做的事情以获得想要的东西(对于for是局部的单个变量):{&nbsp; &nbsp; let x = 0;&nbsp; &nbsp; for (; x < length; x++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; things["fun" + x] = function() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(x);&nbsp; &nbsp; &nbsp; &nbsp; };&nbsp; &nbsp; }}在何处修改更直观(如果是虚构的)版本以在每次迭代中处理新变量:for (let x = 0; x < length; x++){&nbsp; &nbsp; let y = x;&nbsp; &nbsp; things["fun" + y] = function() {&nbsp; &nbsp; &nbsp; &nbsp; console.log(y);&nbsp; &nbsp; };}显而易见,我对y变量的意图是什么。或者如果SANITY统治了宇宙,那将是我的意图。因此,您的第一个示例现在可以在FF中使用;它会产生0、1、2。您可以解决此问题。我称这个问题为WTFJS。ps。我对WTFJS的引用来自上面的JoeyTwiddle;这听起来像是我今天之前应该知道的一个模因,但是今天是学习它的好时机。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答