# 闭包的几种实现

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);
}