1.转载https://www.cnblogs.com/fly_dragon/p/8669057.html
2.对于for循环+setTimeout的理解
//1块级作用域
// 对于let来说,分出了十块不同的作用域,里面的i值互不相通
// 和影响,执行玩定时器后再打印十个不同的i
for (let i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i); // i 是循环体内局部作用域,不受外界影响。
}, 0);
}
// > 0
// > 1
// > 2
// > 3
// > 4
// > 5
// > 6
// > 7
// > 8
// > 9
// 对于var,十个i是相通的,一个变,个个变,而i=0的那时候的
// setTimeout的回调函数等到i=10之后才会执行(事件循环机制))
// 这时候所有的i都已经变成了10了,所以看到效果打印出来都是10
for (var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i); // i 是循环体内局部作用域,不受外界影响。
}, 0);
}
// > 10
// > 10
// > 10
// > 10
// > 10
// > 10
// > 10
// > 10
// > 10
// > 10
- Var的时候,Settimeout本身是同步的, 但它里面的函数是异步的, for每次循环的时候settimeout也会执行 ,但是settimeout里面的函数不会执行, 会被放入到异步队列中 ,等道主任务for循环结束后,再从异步队列打印出东西
- 使用 let 声明迭代变量时,JavaScript 引擎在后台会为每个迭代循环声明一个新的迭代变量。
每个 setTimeout 引用的都是不同的变量实例,所以 console.log 输出的是我们期望的值,也就是循
环执行过程中每个迭代变量的值。