【问题标题】:TypeScript 'let' variable and asynchronous callTypeScript 'let' 变量和异步调用
【发布时间】:2016-11-11 01:34:11
【问题描述】:

我是 TypeScript 的新手,遇到了这个例子:

for (let i = 0; i < 10 ; i++) {
    setTimeout(function() {console.log(i); }, 100 * i);
}

输出:1,2,3,4,5,6,7,8,9,10

但是

for (var i = 0; i < 10 ; i++) {
    setTimeout(function() {console.log(i); }, 100 * i);
}

输出:10,10,10,10,10,10,10,10,10,10

谁能解释一下原因?

【问题讨论】:

标签: variables asynchronous typescript


【解决方案1】:

这是由于范围不同

这是由于 var 和 let 的范围不同。第一次超时实际上可以完成console.log,我已经被循环更改为10。(本质上,您正在堆叠具有各种超时的console.log,它们只会在时间完成时运行)。

使用 let,即块的 scoped,我获取 console.log 中的值(因为它的作用域是它调用的块)。换句话说,一旦遇到此代码,该变量就会在您的超时时间内“受限”于函数。这意味着即使循环改变了它之外的变量“i”,它并没有改变函数的变量。

【讨论】:

  • 我认为你把事情搞混了:var 具有封闭函数的范围,而 let 仅具有块的范围。使用var,您重用了同一个变量,而let 实际上创建了10 个不同的变量,称为i,每个变量都有不同的值。
  • @Robin 是的,看来我把它们弄混了,请随时发表您的评论作为答案 :-) 我会在您这样做后删除我的答案,所以您可以看到评论 ^ ^
【解决方案2】:

@DylanMeeus 是正确的,因为这是一个范围界定/关闭问题。为了帮助可视化这一点,这是在 es5 中使用“let”编译的内容:

var _loop_1 = function(i) {
    setTimeout(function () { console.log(i); }, 100 * i);
};
for (var i = 0; i < 10; i++) {
    _loop_1(i);
}

注意_loop_1 中的i 是一个新的号码实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 2015-02-19
    • 1970-01-01
    • 2016-12-28
    • 2020-06-09
    • 1970-01-01
    相关资源
    最近更新 更多