我是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);
}
有人可以解释原因吗?
答案 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
是一个新的数字实例。