被遗忘的setTimeout第三个参数
平时我们使用
setTimeout
设置定时器,都只使用过前两个参数
setTimeout(func, timeout)
// func 执行函数
// timeout 设置的定时时间
举个例子:在for循环中使用setTimeout
for (var i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i)
}, 1000)
}
● 这是一道很经典的面试题,可以随口说出打印三个3,因为setTimeout
是异步操作,for
循环已经执行结束
● 那如何让它可以打印0、1、2呢?
● var
改为let
可以解决
● 也可以使用setTimeout
的第三个参数解决
for (var i = 0; i < 3; i++) {
setTimeout((j) => {
console.log(j)
}, 1000, i)
}
// 0
// 1
// 2
● setTimeout
第三个参数及其后面的参数,都是传给第一个函数的
function sum(a, b) {
console.log(a + b)
}
setTimeout(sum, 1000, 1, 2) // 3
function sumTwo(a, b, c) {
console.log(a + b + c)
}
setTimeout(sumTwo, 1000, 1, 2, 3) // 6
● 其实setTimeout
第三个参数不仅可以进行传参,也可以使用函数
● 如果第三个参数时函数的话,会最先执行
let item = 0;
setTimeout(() => {
console.log('第一次' + item)
item++
}, 2000, setTimeout(() => {
// 如果第三个参数时函数的话,会最先执行
console.log('第二次' + item)
item++
}))
// 第二次0
// 第一次1