6、變量提升的處理機制(1)

1、變量提升:在當(dāng)前上下文中(全局/私有/塊級),JS代碼自上而下執(zhí)行之前,
瀏覽器會提前處理一些事情(可以理解為詞法解析的一個環(huán)節(jié),詞法解析一定
發(fā)生在代碼執(zhí)行之前):會把當(dāng)前上下文中所有帶VAR/FUNCTION關(guān)鍵字的進
行提前的聲明或者定義

聲明declare:var a
定義defined: a = 10

帶 var 的只會提前的聲明
帶 function 會提前聲明加定義

console.log(a);  // undefined
var a = 12;  // 不需要再聲明a了,只需要賦值就行
a = 13;
console.log(a);  // 13
func();
function func() {
    var a = 12;
    console.log('OK');
}
//  真實項目中建議使用函數(shù)表達式創(chuàng)建函數(shù),因為這樣在變量提升階段
//  只會聲明函數(shù)不會賦值
//  func();  // Uncaught TypeError: func is not a function
var func = function () {
    console.log('OK')
};
//  func(); // 正確執(zhí)行

匿名函數(shù)“具名化”

var func = function AAA() {
    /**
     把原本作為值的函數(shù)表達式匿名函數(shù)“具名化”(雖然說是起了名字,
     但是這個名字不能在外面訪問,也就是不會在當(dāng)前的上下文中創(chuàng)建
     這個名字)
   */
    /**
     當(dāng)函數(shù)執(zhí)行時,在形成的私有上下文中,會把這個具名化的名字作為私有
     上下文中的變量(值就是這個函數(shù))來進行處理
    */
    console.log('OK');
}
AAA();  //  Uncaught ReferenceError: AAA is not defined  
console.log(a);  // ReferenceError: a is not define
a = 13;
console.log(a)
console.log(a);  // Uncaught ReferenceError: Cannot access 'a' before initialization
let a = 12;
a = 13;
console.log(a);

2、基于 var 或者function 在 全局上下文 中聲明的變量(全局變量)會 “映射”到
GO(全局對象window)上一份,并且成為他的屬性,而且接下來是一個修改,
另外一個也會跟著修改

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容