JS练习题-改造下面的代码,使之输出0-9


题目

改造下列代码,使之输出 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);
}

文章作者: CassielLee
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 CassielLee !
评论
  目录