《JS 函数的执行时机》--举例演示

188 阅读1分钟

关于6个6问题

所谓时机不同,结果不同~

let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}
//结果输出6个6

for循环在主线程内,setTimeout是异步方法,在任务队列里面,只有主线程执行完后,任务队列才执行,当for执行结束时候,此时的i值已经是6,所以得到结果是个6。

那么如何输出0-5呢。

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

这是JS后来为新人开发者改变的一个东西。让代码按着新人的思路来实现。

出了上面这种方法能够实现打印0-5 那么还有其他方法吗?

  1. 可以通过自执行函数来实现
  for (var i = 0; i <= 5; i++) {
     !(function (j) {
       setTimeout(function print() {
         console.log(j);
       }, 0);
     })(i);
   }
   ```
 2. 通过setTimeout第三个参数
 
 ```js
 for (var i = 0; i < 6; i++) {
     setTimeout((i) => console.log(i), 0, i);
   }