经典面试题: 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次,
希望能对看到这篇帖子的你有所帮助!