问题: 以下代码 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次, 希望能对看到这篇帖子的你有所帮助!