延迟函数的回调是在循环结束时才执行。当定时器在运行时即使每个迭代中执行的是setTimeout(…,0),所有的回调函数依然是在循环后才会被执行。因此每次都输出6.尽管循环中的五个函数是在各个迭代中分别定义的,但是他们都被封闭在一个共享的全局作用域中,因此实际上只有一个i。
for(var i=1;i<=5;i++){
(function () {
setTimeout(function timer() {
console.log(i);
},i*1000);
})();
} //输出5次 6
解决方法:
for(var i=1;i<=5;i++){
(function () {
var j=i;
setTimeout(function timer() {
console.log(j);
},j*1000);
})();
}
for(var i=1;i<=5;i++){
(function (j) {
setTimeout(function timer() {
console.log(j);
},j*1000);
})(i);
}
---------------------
原文:https://blog.csdn.net/caoxinhui521/article/details/78011309