JS函数的执行时机

276 阅读2分钟

JS函数在不同的时候运行,会有不同的运行结果

 同步任务:

上一件事情没有完成,继续处理上一件事情,只有上一件事情完成了,才会做下一件事情
JS中大部分都是同步编程

案例一

let a = 1 
function fn(){
     console.log(a) 
}
//a不存在,因为fn没执行

这里不会打印任何东西,因为函数只是声明了,但是没有执行

案例二

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

这里会打印a, 因为一开始声明了 a , a 的值为1,然后调用函数 fn , 打印 a。

异步任务:

计划要做一件事情,但是不是当前立马去执行这件事情,需要等一定的时间,这样的话,我们不会等着他执行,而是继续执行下面的操作。

案例一

let a = 1
  function fn()	{
   setTimeout(()=>{ 
    console.log(a)
  },0)
  }
fn()  //js会先执行当前代码(先执行a=2),然后再做等会再做的事情(然后执行setTimeout
a = 2

image.png

setTimeout会等到当前代码执行完毕后,再执行,即执行完let a= 1, fn(), a=2之后,再执行console.log(a)
所以打印出来a是2

案例二

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

image.png

当for循环每执行一次时,setTimeout都会执行一次,setTimeout等到当前代码的for循环执行完了,然后再去执行console.log(i)
而for循环执行完之后,i已经是6了

案例三

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

image.png

在for循环i的中加上let。会产生一个隐藏的作用域。在每次执行for循环时,JS会保留i的初始值,然后重新声明执行一次。相当于

(let i = 0) { 
    setTimeout(()=>{ 
        console.log(i) 
        },0) 
} 
(let i = 1) { 
    setTimeout(()=>{ 
        console.log(i) 
        },0) 
} 
(let i = 2) { 
    setTimeout(()=>{ 
        console.log(i) 
        },0) 
}
(let i = 3) { 
    setTimeout(()=>{ 
        console.log(i) 
        },0) 
} 
(let i = 4) { 
    setTimeout(()=>{ 
        console.log(i) 
        },0) 
} 
(let i = 5) { 
    setTimeout(()=>{ 
        console.log(i) 
        },0) 
};

关于setitmeout的通俗理解

打游戏,马上推掉敌方水晶了,这时候有人叫你过去,你嘴上说马上(对应setTimeout(function, 0)),但其实会把游戏打完之后再去。

案例四

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

image.png

var 不配合setTimeout