setTimeout闭包常见问题

  经常会遇到这样的问题,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 }
原文地址:https://www.cnblogs.com/ljwk/p/8532998.html