# ❓改造下面的代码,使之输出 0 - 9,写出你能想到的所有解法

for (var i = 0; i < 10; i++) {
  setTimeout(() => {
    console.log(i)
  }, 1000)
}
1
2
3
4
5

# 方法 1

利用函数自执行的方式,把当前 for 循环过程中的 i 传递进去,构建出块级作用域。

for (var i = 0; i < 10; i++) {
  ;(function(i) {
    setTimeout(() => {
      console.log(i)
    }, 1000)
  })(i)
}
1
2
3
4
5
6
7

# 方法 2

利用 es6 let,利用 let 变量的特性 — 在每一次 for 循环的过程中,let 声明的变量会在当前的块级作用域里面(for 循环的 body 体,也即两个花括号之间的内容区域)创建一个文法环境(Lexical Environment),该环境里面包括了当前 for 循环过程中的 i相关文章

for (let i = 0; i < 10; i++) {
  setTimeout(() => {
    console.log(i)
  }, 1000)
}
1
2
3
4
5

# 方法 3

利用 setTimeout 函数的第三个参数,会作为回调函数的第一个参数传入相关文章

for (var i = 0; i < 10; i++) {
  setTimeout(
    i => {
      console.log(i)
    },
    1000,
    i
  )
}
1
2
3
4
5
6
7
8
9

其实我就写出来了前两个

更多方法参考more