本文共 655 字,大约阅读时间需要 2 分钟。
在原来的代码中,使用var声明的i变量在setTimeout函数内部会受到外部变量的引用问题影响,导致所有的setTimeout回调都使用了最后一次循环中的i值。以下是优化后的代码,能够正确输出0到9:
for (var i = 0; i < 10; i++) { (function(j) { setTimeout(() => { console.log(j); }, 1000); })(i);} for (let i = 0; i < 10; i++) { setTimeout(() => { console.log(i); }, 1000);} for (var i = 0; i < 10; i++) { setTimeout((i) => { console.log(i); }, 1000, i);} for (var i = 0; i < 10; i++) { ((j) => { setTimeout(() => { console.log(j); }, 1000); })(i);} 这些方法都通过不同的方式确保setTimeout回调中使用的i值是当前循环中的值,而不是最后一次循环中的值,从而能够正确输出0到9。
转载地址:http://opyq.baihongyu.com/