Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 打字稿';让';变量和异步调用_Variables_Asynchronous_Typescript - Fatal编程技术网

Variables 打字稿';让';变量和异步调用

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。(本质上,您是在堆叠带有各种超时

我对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。(本质上,您是在堆叠带有各种超时的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);
}