经典面试题: for循环setTimeout取值
经典面试题: for循环setTimeout取值
问题: 以下代码 console 出来的值是什么
const arr = [1,2,3]
for (var val of arr) {
setTimeout(()=> {
console.log('setTimeout:', val)
}, 3000)
}
可能你会说:3秒之后控制台输出 1 2 3
但这么想是 错的
实际上输出的是 3个3
让我们再来加一层console试一下
看下setTimeout外层是不是也这样
const arr = [1,2,3]
for (var val of arr) {
console.log('for:', val)
setTimeout(()=> {
console.log('setTimeout:', val)
}, 3000)
}
返回的结果
setTimeout外面依次返回了1 2 3
然后3秒后返回了3个3
也就是说都是返回的数组的最后一项
因为定义了一个 val 变量,
for循环的时候后面的值把前面的值覆盖了,
由于setTimeout是异步的,
所以setTimeout输出console的时候覆盖操作已经发生了。
这不是智障小儿科,
这确实是一道经典面试题,
很多大公司都会问到,
我自己就经历过2次,
希望能对看到这篇帖子的你有所帮助!