当前位置: 首页 > 面试题库 >

for循环中的let关键字

祁高格
2023-03-14
问题内容

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

"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


问题答案:

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

for(let i;;){}

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

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



 类似资料:
  • 本文向大家介绍jQuery中的for循环var与let的区别,包括了jQuery中的for循环var与let的区别的使用技巧和注意事项,需要的朋友参考一下 今天在写jQuery请求接口中发现一个问题:       在用AJAX发送请求中又嵌套了一个AJAX请求,发现在内层请求的success中对第一次success中的循环变量 i 无法获取,具体代码如下:   在第二次的ajax请求后的回调函数中

  • 问题内容: 我了解操作员在此代码中的作用: 我也明白这将采用此代码中列表的每个值: 我很好奇,如果在使用的操作循环是一样的第一个代码使用运营商。 问题答案: 它们是相同的概念,但不是相同的运算符。 在示例中,是一个处理几种不同情况的运算符。在Python文档的运营商给予的细节,我意译如下:电话,如果有一个成员函数。否则,请尝试迭代查找,如果不存在,则调用。复杂性是为旧代码和新代码提供一致的成员资格

  • 我正在编写一个计算e^x值的方法。我在python中实现它的方式如下。 这将很好地返回e^x的值。但是,当我尝试在c#中实现相同的方法时,它没有输出与python中相同的值。以下是c#中的实现。 起初,这段代码的输出是一个无穷大符号。为了解决这个问题,我只是减少了循环运行的次数。在c#中,循环只运行10次,代码的输出非常接近于python中循环运行100次的输出。我的问题是,在不同的编程语言中,两

  • 问题内容: 我知道这可以防止重复声明,这很好。 用声明的变量也可以在可以预期的闭包中使用 我有点难以掌握的是如何应用于循环。这似乎是特定于循环的。考虑经典问题: 为什么在这种情况下使用有效?在我的想象中,即使只有一个块可见,实际上为每次迭代创建了一个单独的块,并且声明是在该块内部完成的,但是只有一个声明可以初始化该值。这只是ES6的语法糖吗?这如何运作? 我了解和之间的区别,并在上面进行了说明。我

  • 我试图在for循环中获得for循环,因此输出如下: 我希望输出显示一个正方形 我不知道它为什么不这样做。下面是我的代码:

  • 问题内容: 在下面的示例代码中,是否真的需要counter = 0,还是有更好,更多的Python方法来访问循环计数器?我看到了一些与循环计数器有关的PEP,但它们要么被延迟要么被拒绝(PEP 212 和PEP 281)。 这是我的问题的简化示例。在我的实际应用程序中,这是通过图形完成的,整个菜单必须每帧重新绘制一次。但这以易于复制的简单文本方式进行了演示。 也许我还应该补充一点,我正在使用Pyt