TypeScript'let'变量和异步调用

时间:2016-07-08 13:00:40

标签: variables asynchronous typescript

我是TypeScript的新手,并且来自这个例子:

0A

输出: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); }

有人可以解释原因吗?

2 个答案:

答案 0 :(得分:2)

这是由于范围差异

归因于var和let之间的范围差异。第一次超时实际上可以完成console.log,我已经被循环更改为10.(基本上,你正在堆栈具有各种超时的console.logs,它们只会在时间结束时运行。)

使用let,scoped到块,我获取console.log中的值(因为它的范围是它调用的块)。换句话说,一旦遇到这个代码,变量就变得有限了。到你的超时内的功能。这意味着即使循环改变了变量&#39; i&#39;在它之外,它没有改变函数的变量。

答案 1 :(得分:0)

@DylanMeeus是正确的,因为它是一个范围/结束问题。为了帮助想象这一点,这就是使用&#34;让&#34;编译成es5:

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

请注意i中的_loop_1是一个新的数字实例。