以一个 for 循环的例子来解释JS函数的执行时机
let i = 0
for (i = 0; i < 6; i++) {
setTimeout(() => {
console.log(i)
}, 0)
}
代码在执行时,声明了一个变量 i,然后执行 for 循环,for 循环在主线程中执行。循环体中的 setTimeout 是一个异步方法,会放到任务队列中,只有当主线程的代码执行完毕后,才会执行任务队列中的方法。当 for 循环执行结束后,此时 i 为 6,所以得到的结果是 六个六
那么如何改写上面的代码,将其打印出0、1、2、3、4、5呢
在 for 循环内使用 let 声明 i
for (let i = 0; i < 6; i++) {
setTimeout(() => {
console.log(i)
}, 0);
}
通过 var 和 JS 技巧来实现和上面代码的相同功能
通过 setTimeout 的第三个参数来传递每层循环中的 i
for (var i = 0; i < 6; i++) {
setTimeout(i => {
console.log(i)
}, 0, i)
}
通过 JS 的立即执行函数(Immediately Invoked Function Expression)来实现
for (var i = 0; i < 6; i++) {
!(function (currentValue) {
setTimeout(() => {
console.log(currentValue)
}, 0)
})(i)
}
利用 const 声明的变量不可更改的特性
for (var i = 0; i < 6; i++) {
const x = i
setTimeout(() => {
console.log(x)
}, 0)
}