JS 函数的执行时机

90 阅读1分钟

函数的调用时机不同,得到的结果也是不同的。如果含有setTimeout()方法用于在指定毫秒后调用的函数或者表达式,那么得到的结果很有可能会不同。

1. 解释为什么如下代码会打印6个6

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

原因是setTimeout是一个异步任务,执行时会被浏览器丢到另一个任务队列里去,浏览器这时候会继续往下执行,把下面的代码都执行完了才回来执行setTimeout函数里的操作,这时候因为for循环已经把i加到6了,所以输出的全部都是6

简单解释一下异步: 属于异步的代码是不直接执行的,是先执行下面的代码,当运行环境的代码全部执行完之后再回来执行异步代码。

2. 写出让上面代码打印 0、1、2、3、4、5 的方法

    for (let i = 0; i < 6; i++) {
        setTimeout(()=> {
            console.log(i)
        },0)
    }
  • 当let关键字用于循环体中声明i,let关键字自动帮你改为新手想要的结果,这就是JS变态之处。

3. 除了使用 for let 配合,还有什么其他方法可以打印出 0、1、2、3、4、5?

    let i = 0
    for(i = 0; i<6; i++){
        const x = i
        setTimeout(()=>{
        console.log(x)
        }, 0)
    }
  • 这里介绍一种方法: 直接使用const 声明一个变量,这个变量用于接收每次循环得到的i。打印时,打印的是const声明的变量,而const声明的变量不能重新赋值,所以打印出的结果是符合要求的。