setTimeout 的第三个参数

220 阅读1分钟

先看一串代码

for (var i = 0; i < 10; i++) {
      setTimeout(() => {
        console.log(i);
      }, 0);
   }

思考输出的结果及为什么是这个结果

这个结果很容易知道 for循环要等异步执行完才执行 所以输出10次10

1.如果把var 改成let 会输出什么 为什么

改成let 会依次输出0~9 将全局作用于变成块级作用域 把作用域限制住

2.如何改代码让其输出0~9

1).将作用域变成块级 即用let替代var

for (let i = 0; i < 10; i++) {
      setTimeout(() => {
        console.log(i);
      }, 0);
   }

2).在全局作用域内使用闭包和立即执行函数(本人不喜欢闭包)

for (var i = 0; i < 10; i++) {
        (function (j) {
          setTimeout(() => {
            console.log(j);
          }, 0);
      })(i);
   }

3).用 setTimeout 的第三个参数解决

for (var i = 0; i < 10; i++) {
        setTimeout((j) => {
          console.log(j);
      }, 0, i);
   }

setTimeout第三个参数指向的就是函数的参数