JS 函数的执行时机

72 阅读1分钟

执行时机决定了函数的结果

案例一

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

结果为1, 因为一开始声明了a, a的值为1,然后调用函数 fn, 打印出a(1)。

案例二

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

结果为2,调用fn之前,a被赋值为2。

案例三 有SetTimeout的情况1

let a = 1
function fn(){
    setTimeout(()=>{
        console.log(a)
    },0)
}
fn() // 2
a = 2

结果为2,因为运行完再执行fn,运行完后a已经是2了。
你正在打游戏,还剩下最后一关,这时候你妈妈让你去吃饭,你嘴上说马上(相当于setTimeout,但其实会把游戏打完之后再去吃饭。

案例四 有SetTimeout的情况2

let i = 0
for(i = 0; i<6; i++){
    setTimeout(()=>{
        console.log(i)
    },0)
}
//会打印出6个6

setTimeout会等到当前代码的for循环执行完了,再去执行console.log(i),而for循环执行完之后,i已经是6了,所以会打印出6个6

案例四 有SetTimeout的情况3

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

let 会单独创建一个作用域,相当于有6个i,最后分别打出0,1,2,3,4,5

打0,1,2,3,4,5的其他方法

let i = 0 
for (i = 0; i < 6; i++) { 
    setTimeout((function(i){ 
        return function() { 
            console.log(i); 
        } 
    }(i)),0) 
} // 0 1 2 3 4 5