# 经典面试题示例
// 以下函数打印值全部为5且程序创建了5个timer
for(var i = 0; i<5; i++){
setTimeout(function(){
console.log(i)
}, i * 1000)
}
# 原因
js是单线程的,任务队列中一个消息执行完才会执行下一个消息,setTimeout的消息总是在主程序消息执行完成后最后才执行。(这块我不是很明白,待弄清楚了js的事件循环和消息队列等,再来补充)
# 解决
给函数一个独立的封闭的作用域。
类似于闭包那种环境,函数既能访问自由变量,又有自己的独立范围。
# 闭包
for(var i=0; i<5; i++){
setTimeout(function(i) {
return function() {
console.log(i)
}
}(i), 1000)
}
# 自执行函数
for(var i=0; i<5; i++){
+function(i){
setTimeout(function(){
console.log(i)
}, 1000)
}(i)
}
# 使用let制造块级作用域
for (let i=0; i<5; i++){
setTimeout(function() {
console.log(i)
}, 1000)
}