为了账号安全,请及时绑定邮箱和手机立即绑定

for循环中的let关键字

for循环中的let关键字

慕哥9229398 2019-11-13 14:59:35
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 3things["fun1"](); // prints 3things["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 0things["fun1"](); // prints 1things["fun2"](); // prints 2我使用Traceur和来测试了脚本node --harmony。
查看完整描述

3 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

quin着眼睛的答案不再是最新的。在ECMA 6规范中,指定的行为是


for(let i;;){}

i 在循环的每次迭代中获取一个新的绑定。


这意味着每个闭包都捕获一个不同的i实例。因此,截至目前的结果012是正确的结果。在Chrome v47 +中运行此程序时,您将获得正确的结果。在IE11和Edge中运行它时,当前333似乎会产生不正确的结果()。


有关此错误/功能的更多信息,请参见本页中的链接;


由于使用let表达式时,每次迭代都会创建一个新的词汇作用域,该作用域链接到先前的作用域。这对于使用该let表达式有性能影响,在此处进行了报道。


查看完整回答
反对 回复 2019-11-13
?
梵蒂冈之花

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;这听起来像是我今天之前应该知道的一个模因,但是今天是学习它的好时机。


查看完整回答
反对 回复 2019-11-13
  • 3 回答
  • 0 关注
  • 729 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信