题目
改造下列代码,使之输出 0-9
for (var i = 0; i < 10; i++) {
setTimeout((i) => {
console.log(i);
}, 1000);
}
分析
主要考察对于变量作用域的理解,解决变量作用域即可。
答案
解法一
利用 setTimeout 第三个参数会做为回调函数的第一个参数传入的特性解决问题
for (var i = 0; i < 10; i++) {
setTimeout(
(i) => {
console.log(i);
},
1000,
i
);
}
解法二
利用 let 变量的特性 — 在每一次 for 循环的过程中,let 声明的变量会在当前的块级作用域里面(for 循环的 body 体,也即两个花括号之间的内容区域)创建一个文法环境(Lexical Environment),该环境里面包括了当前 for 循环过程中的 i。
for (let i = 0; i < 10; i++) {
setTimeout(() => {
console.log(i);
}, 1000);
}
解法三
利用 bind 函数部分执行的特性
for (var i = 0; i < 10; i++) {
setTimeout(console.log.bind(null, i), 1000);
}
解法四
利用闭包
for (var i = 0; i < 10; i++) {
((j) => {
setTimeout(() => {
console.log(j);
}, 1000);
})(i);
}