-版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。
-本文鏈接:https://blog.csdn.net/sinat_41695090/article/details/81284355
首先來(lái)段總結(jié)
引擎在讀取Js代碼的過(guò)程中,分為兩步。第一個(gè)步驟是這個(gè)Js代碼的解析讀取,第二個(gè)步驟是執(zhí)行。
在讀取代碼的過(guò)程中,就產(chǎn)生了將所有聲明提升到頂端,然后再?gòu)纳贤聢?zhí)行。由此產(chǎn)生了變量提升和函數(shù)提升。
1.變量提升只會(huì)提升變量名的聲明,而不會(huì)提升變量的賦值初始化。
2.函數(shù)提升的優(yōu)先級(jí)大于變量提升的優(yōu)先級(jí),級(jí)函數(shù)提升在變量提升之上。
記住這兩句話就可以從容不迫的寫(xiě)代碼了
console.log(foo);
foo(); //可以執(zhí)行
var foo = 10;
foo(); //foo已經(jīng)被賦值為一個(gè)變量,無(wú)法執(zhí)行為foo為函數(shù)
console.log(foo);
function foo(){
var a;
console.log(a);
a = 12;
console.log(a);
}
console.log(foo);
-猜猜輸出什么?

image.png
-實(shí)際的執(zhí)行順序
function foo(){
var a;
console.log(a);
a = 12;
console.log(a);
}
var foo();
console.log(foo);
foo();
foo = 10;
foo(); //由于這里報(bào)錯(cuò),foo已經(jīng)被賦值,找不到這個(gè)函數(shù),下面的都不會(huì)被執(zhí)行
console.log(foo);
console.log(foo);
還有幾個(gè)例子總結(jié):
function foo(){
console.log(x);
}
foo();
var x=1; //undefined
-輸出結(jié)果:undefined
function foo(){
var x=1;
}
foo();
console.log(x);
-輸出結(jié)果:報(bào)錯(cuò)!
function foo() {
console.log(x);
}
var x =1;
foo();
-輸出結(jié)果:1
console.log(f1());
console.log(f2);
function f1(){
console.log('aa');
}
var f2 = function(){};
-輸出結(jié)果依次是:aa,undefined,undefined