一个for循环,分别采用var和let声明变量:
window.onload = function () {
for (var i = 0; i < 5; i++) {
setTimeout(() => { console.log(i) }, 200)
}
for (let k = 0; k < 5; k++) {
setTimeout(() => { console.log(k) }, 200)
}
}
测试的结果:
结果分析:
- for循环是同步任务,setTimeout()是异步任务,进行异步任务时for循环已经循环完毕,所以得到的值 i 是循环完成之后的同一个变量 i = 5
- let具有块级作用域,每次循环时,块级作用域中的 i 都是独立存在的,而 js 引擎底层又对每次迭代的 i 的值进行了记忆,所以最后打印结果为 0 1 2 3 4