js 闭包
08 March 2018
for (var i = 1; i <= 5; i++) {
  setTimeout(function timer() {
    console.log(i);
  }, i * 1000);
}

// res:
// 6
// 6
// 6
// 6
// 6
// 6
for (let i = 1; i <= 5; i++) {
  setTimeout(function timer() {
    console.log(i);
  }, i * 1000);
}

// res:
// 1
// 2
// 3
// 4
// 5
// 6

不使用 let 的写法

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

第一个出现都是 6 的原因是 setTimeout 方法在调用的时候不会马上执行里面的 function ,直到 timeout 才执行。然而,timeout 到了之后 变量 i 已经变成 6。

如果我们用 (function() { setTimeout ...})() 来立即执行的话,还要消除变量的穿透


相关阅读
setTimeout 函数之循环和闭包