//循环输出通一变量值
for(var i=0;i<5;i++){ console.log(i) //0,1,2,3,4 全局
setTimeout(function(){
console.log(i) //5,5,5,5,5 内部
},1000);
}
为什么会产生这样的结果?
首先,这里的i属于全部变量,即函数中所获取的i。
再者,i<5时,i一直在自加,知道i=5时停止自加,然后开始执行函数,所以目前函数中i已经为5。
使用闭包解决:
//方法一:i作为参数传递至内部函数
for(var i=0;i<5;i++){
(function(k){
setTimeout(function(){console.log(k)},1000)
})(i);
}
//方法二:闭包内声明局部变量K,将i赋值给K
for(var i=0;i<5;i++){
(function(){
var K = i;
setTimeout(function(){console.log(K)},1000)
})();
}
//方法三:闭包内返回函数
for(var i=0;i<5;i++){
(function(){
return function(){console.log(i)}
})()()
}
或for(var i=0;i<5;i++){
setTimeout((function(k){
return function(){console.log(k)}
})(i),1000)
}或
for(var i=0;i<5;i++){
(function(k){
return function(){console.log(k)}
})(i)()
}