# ❓改造下面的代码,使之输出 0 - 9,写出你能想到的所有解法
for (var i = 0; i < 10; i++) {
setTimeout(() => {
console.log(i)
}, 1000)
}
1
2
3
4
5
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
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
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
2
3
4
5
6
7
8
9
其实我就写出来了前两个
更多方法参考more