variables - TypeScript 'let' 变量和异步调用

标签 variables asynchronous typescript

我是 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

谁能解释一下原因吗?

最佳答案

这是由于作用域的不同

这是由于 var 和 let 之间的作用域差异。第一次超时实际上可以完成 console.log,i 已经被循环更改为 10。(本质上,您正在堆叠具有各种超时的 console.logs,它们只会在时间结束时运行)。

对于 scoped 到 block 的 let,i 获取 console.log 中的值(因为它的范围是它调用的 block )。换句话说,一旦遇到此代码,变量就会“限制”到超时内的函数。这意味着即使循环在其外部更改了变量“i”,它也没有更改函数的变量。

关于variables - TypeScript 'let' 变量和异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38267381/

相关文章:

链接到批处理文件的java变量

python - 当作为参数传递给具有可变参数的函数时,列表解包如何工作?

C# 在所有完成后将异步方法的结果相加

Typescript - 基于另一个属性的条件属性

javascript - 在 SlateJS 中,当存在多个编辑器时,如何将焦点更改为特定的编辑器?

variables - 找不到变量 : FB?

variables - SAS中如何随机选择变量?

javascript - 等待 1 个 promise ,然后所有 promise 都使用 $q

javascript - 如何用jquery延迟函数的执行?

reactjs - 从另一个 ActionCreator 调用一个 ActionCreator