變量聲明前置
變量聲明出現(xiàn)在代碼中的任何位置都會在該代碼執(zhí)行前處理陪捷,這意味著變量可以在聲明之前使用,這個行為叫"hoisting"章鲤,即把在指定作用域內(nèi)聲明的變量提升到函數(shù)或全局代碼的頂部。
聲明變量的作用域限制在其聲明位置的上下文中辐益,而未聲明變量總是全局的,所以總在作用域最開始聲明變量可以使變量的作用域變得清晰脱吱。
示例:
console.log(a); // undefined
var a = 1;
console.log(b); //Referencerror: b is not deined
- 由上到下執(zhí)行代碼之前智政,解析器會先找到var關(guān)鍵字,找到了var a 箱蝠,就提升var a 并將a初始化為undefined
- 再由上往下執(zhí)行续捂,讀到console.log(a),控制臺打印出來的就是undefined。
- 接著給變量a賦值宦搬,如果這個時候在后面加console.log(a)牙瓢,那么控制臺打印出來的就是1.
- console.log(b),在前面沒有對b進(jìn)行聲明间校,所以報錯一罩。
變量會在代碼執(zhí)行之前就創(chuàng)建,初始化并賦值undefined
變量的聲明會提升撇簿,變量的賦值不會提升
函數(shù)聲明前置
使用function關(guān)鍵字可以聲明一個函數(shù)聂渊,他的特征是函數(shù)聲明提升,執(zhí)行代碼之前會讀取函數(shù)聲明四瘫,即聲明不必放在調(diào)用的前面汉嗽,可以放在作用域的任何位置。
a();
function a(){
console.log(''hello'')
}
以上代碼沒有return找蜜,返回值undefined
a();
function a(){
return(''hello'')
}
以上代碼返回值''hello''
JS引擎的過程
- 扎到所有用function聲明的函數(shù)饼暑,在環(huán)境中創(chuàng)建這些函數(shù)
- 將這些函數(shù)初始化并賦值為function(){}
- 開始執(zhí)行代碼a()
函數(shù)提升的優(yōu)先級高于變量提升的優(yōu)先級