循环绑定

习题一

for(var i = 1; i <= 5; i ++) {
  setTimeout(function timer() {
    console.log(i)
  }, 0)
}

// 输出
6 6 6 6 6
// 因为 setTimeout 为宏任务,由于 JS 中单线程 eventLoop 机制,在主线程同步任务执行完后才去执行宏任务,
// 因此循环结束后 setTimeout 中的回调才依次执行,但输出 i 的时候当前作用域没有,往上一级再找,
// 发现了 i,此时循环已经结束,i 变成了 6。
// 因此会全部输出 6。

// 法一:let。
for(let i = 1; i <= 5; i++) {
  setTimeout(function timer() {
    console.log(i)
  }, 0)
}

// 法二:IIFE。
for(var i = 1;i <= 5;i++) {
  (function(j) {
    setTimeout(function timer() {
      console.log(j)
    }, 0)
  })(i)
}

// 法三:setTimeout 第三个参数。
for(var i=1;i<=5;i++) {
  setTimeout(function timer(j) {
    console.log(j)
  }, 0, i)
}

习题二

var data = []

for (var i = 0; i < 3; i++) {
  data[i] = function () {
    console.log(i)
  }
}

data[0]()
data[1]()
data[2]()

// 输出
3 3 3
Last Updated:
Contributors: Vsnoy