经典面试题: for循环setTimeout取值

tech2024-06-13  69

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

最新回复(0)