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