JS 函数的执行时机

137 阅读2分钟

不同时机执行JS函数对结果的影响。

JS 函数的执行时机对 JS 函数执行的结果影响很大。

调用时机:时机不同,结果就不同

举例说明各种情况

一:函数未执行

let a = 1
function fn(){
    console.log(a)
}
// 不打印任何东西,因为函数没有执行

二:函数执行时机先后的影响

  1. 开始声明了变量a, 变量a的值为1,然后调用函数fn , 打印 a.
let a = 1
function fn(){
    console.log(a)
}
fn() // 1 
  1. 一开始声明了a, a 的值为1,然后在函数之前将2 赋值给a. 所以打印出a的值为2.
let a = 1
function fn(){
    console.log(a)
}
a = 2
fn()  // 2
  1. 函数执行后改变 a的值,函数执行的时候,a 的值依旧为1.
let a = 1
function fn(){
    console.log(a)
}
fn() // 1
a = 2

所以我们可以看出,函数中某个变量值的判断,需要确定函数执行的时机。一开始声明的时候可能是某个值,但在函数执行的时候这个值可能已经改变了。


  1. setTimeout函数

输出结果为2setTimeout这个函数会等一会在执行,即任务执行完后在执行setTimeout,因此打印打印结果为2

let a = 1
function fn(){
    setTimeout(()=>{
        console.log(a)
    },0)
}
fn() // 2
a = 2
  1. 打印出66 。 因为 i 是全局变量。for 循环执行完毕之后 i 的值为6。是的i =6 。因为 i = 5 满足条件(<6)是最后一轮循环,然后i++,所以 i 为6。这个循环自始至终都是在改变一个 i 的值。所以会打印6个6。
let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

三:如何打印出 0,1,2,3,4,5,6

  1. for 循环配合let 将i定义到for循环体中,i在for循环中每次运行的结果都会被储存,相当于有6个i。因此for循环运行下来结果为0,1,2,3,4,5,而setTimeout会等着for循环结束之后再进行打印,打印的结果为0,1,2,3,4,5。
for(let i = 0;i<6;i++){
    setTimeout(()=>{
    console.log(i)
},0)
}
  1. 闭包
let i = 0
for(i = 0; i<6; i++){
  !function(j){
      setTimeout(()=>{
        console.log(j)
      },0)
  }(i)
}
  1. setTimeout 的第三个参数,将i传进去
let i = 0
for(i = 0; i<6; i++){
    setTimeout((value)=>{
      console.log(value)
    },0,i)
}
  1. const 关键字
let i = 0
for(i = 0; i<6; i++){
    const x = i
    setTimeout(()=>{
      console.log(x)
    })
}