# 经典面试题示例
// 以下函数打印值全部为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)
}