闭包的经典题目
目的:我们想要这段代码分别输出数字1-5,每秒一次,每次一个。
你以为写法:
for(var i=1;i<=5;i++){
setTimeout(function time(){
console.log(i);
},i*1000)
}
结果:
输出:6,6,6,6,6
啊,啊,啊,为什么会输出5个6,而不是1,2,3,4,5
问题理解解答:
这里就涉及闭包的理解:
注意:延迟函数会在循环执行结束后执行。
也就是说:
仔细想一想,延迟函数的回调会在循环结束的时候才执行,。事实上,当定时器运行时即使每个迭代中执行的是setTimeout(…,0),所有的回调函数仍然是在循环结束之后才会被执行,因此每次都输出6
解答:
for(var i=1;i<=5;i++){
(function(){
var j=i;
setTimeout(function time(){
console.log(j);
},j*1000)
})()
}
输出:1,2,3,4,5
Es6之后可以下面这样写(const和let使用):
for(let i=1;i<=5;i++){
setTimeout(function time(){
console.log(i);
},i*1000)
}
小编O_O