for循环体内setTimeout函数中打印的面试问题

tech2025-10-18  15

// 输出10次10,因为settimeout是异步的,for循环是单线程的,执行到settimeout时已经循环完了 for(var i=0;i<10;i++) { setTimeout(() => { console.log(i) }, 100*i); } // settime延迟为0也打出10 for(var i=0;i<10;i++) { setTimeout(() => { console.log(i) }, 0); } // 有两种有效的解决方案: // 1.增加一个立即执行函数就能解决这个问题--相当于构成一个闭包 for(var i=0;i<10;i++) { (function(j){ setTimeout(() => { console.log(j) }, 100*j); })(i); } // 2.更简单的方式是使用let--有块作用域,不会变量溢出 for(let i=0;i<10;i++) { setTimeout(() => { console.log(i) }, 100*i); }

这种for循环体内setTimeout函数中打印的问题在面试中很常见,考察到var变量溢出,let作用域,闭包和异步函数问题,还是很经典的

最新回复(0)