# 闭包的几种实现
for(var i=0;i<5;i++){
setTimeout(function(){
console.log(i)
},i*1000)
}
//全部输出5,setTimeout是异步函数,所以先把循环执行完毕,i已经是5了,然后执行定时任务内部时,结果都是5
方法一 :使用闭包
for(var i=0;i<5;i++){
(function(k){
setTimeout(function(){
console.log(k)
},k*1000);
})(i)
}
方法二 : setTimeout 第三个参数,第三个及之后的参数可以是变量,也可以是方法传进去
for(var i=0;i<5;i++){
setTimeout(function(k){
console.log(k)
},i*1000,i)
}
//扩展
for(var i=0;i<5;i++){
setTimeout(function(k,kk){
console.log(k+kk)
},i*1000,i,i*10)
}
方法三 : let 块级作用域处理 ,把var 替换掉就可以
for(let i=0;i<5;i++){
setTimeout(function(){
console.log(i)
},i*1000);
}