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