Variables 打字稿';让';变量和异步调用
我对TypeScript不熟悉,因此遇到了以下示例:Variables 打字稿';让';变量和异步调用,variables,asynchronous,typescript,Variables,Asynchronous,Typescript,我对TypeScript不熟悉,因此遇到了以下示例: for (let i = 0; i < 10 ; i++) { setTimeout(function() {console.log(i); }, 100 * i); } 输出:10,10,10,10,10,10,10,10,10,10 有人能解释一下原因吗?这是由于范围不同造成的 这是由于var和let之间的范围差异造成的。当超时第一次真正完成console.log时,我已经被循环更改为10。(本质上,您是在堆叠带有各种超时
for (let i = 0; i < 10 ; i++) {
setTimeout(function() {console.log(i); }, 100 * i);
}
输出:10,10,10,10,10,10,10,10,10,10
有人能解释一下原因吗?这是由于范围不同造成的
这是由于var和let之间的范围差异造成的。当超时第一次真正完成console.log时,我已经被循环更改为10。(本质上,您是在堆叠带有各种超时的console.log,它们只会在时间结束时运行)
对于let,它的作用域是
到块,我在console.log中获取值(因为它的作用域是从它调用的块)。换句话说,一旦遇到此代码,变量就被“限制”到超时内的函数。这意味着,即使循环在其外部更改了变量“i”,它也没有更改函数的变量 @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);
}
var\u loop\u 1=函数(i){
setTimeout(函数(){console.log(i);},100*i);
};
对于(变量i=0;i<10;i++){
_环_1(i);
}
请注意\u loop\u 1
中的i
是一个新的数字实例。有关更多信息,请参阅……我认为您混淆了:var
具有封闭函数的范围,而let
仅具有块的范围。使用var
您正在重用同一个变量,而let
实际上创建了10个名为i
的不同变量,每个变量都有不同的值。@Robin是的,看起来好像我把它们混在一起了,请随意发表您的评论作为答案:-)在您这样做之后,我将删除我的答案,以便您可以看到评论^^
var _loop_1 = function(i) {
setTimeout(function () { console.log(i); }, 100 * i);
};
for (var i = 0; i < 10; i++) {
_loop_1(i);
}