JS 函数的执行时机

69 阅读1分钟

什么是函数的执行时机

JS函数在执行的时候,会根据函数所处位置的不同,执行不同的结果

接下来我们通过几个例子,来实际说明一下JS函数的执行时机

实例:

例1

let a = 1
function fn(){
    console.log(a)
}

上述代码并不会输出任何东西

因为还没有调用函数fn

例2

let a = 1
function fn(){
    console.log(a)
}
fn()

上述代码和例1一样,不过这次调用了函数fn,所以会输出------1

例3

let a = 1
function fn(){
    console.log(a)
}
a = 2
fn()

上述代码最终会输出------2

因为函数fna = 2之后调用的

例4

let a = 1
function fn(){
    console.log(a)
}
fn()
a = 2

上述代码最终会输出-----1

因为函数fna = 2之前就调用了

6个6的问题

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

上述代码最终会输出6个6,这是为什么呢?

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

如何让上述代码打印出0、1、2、3、4、5

方法1

利用for let配合

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

利用 let会产生块级作用域,每一个栈里面的 setTimeouti 是独立的

方法2

传入setTimeout的第三个参数

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

方法3

闭包 + 立即执行函数

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

方法4

利用const关键字

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