经常会遇到这样的问题,setTimeout按序输出循环数字,而不是最后输出同一个数字:
题目:
1 for (var i = 0; i < 5; i++) { 2 setTimeout(function () { 3 console.log(i); 4 }, 1000 * i); 5 }
解决方案:
1 for (var i = 0; i < 5; i++) { // 匿名函数获取值 2 setTimeout(function (n) { 3 return function () { 4 console.log(n); 5 }; 6 }(i), 1000 * i); 7 }
1 for (var i = 0; i < 5; i++) { // 立即执行函数 2 (function (n) { 3 return setTimeout(function () { 4 console.log(n); 5 }, 1000 * n); 6 })(i); 7 }
1 for (let i = 0;i < 5;i++) { // ES6的let,使for循环内部为块级作用域 2 setTimeout(function() { 3 console.log(i); 4 }, 1000 * i); 5 }