# 经典面试题示例

// 以下函数打印值全部为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)
}
# 相关资料

并发循环与事件模型

事件循环