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)上一份,并且成為他的屬性,而且接下來是一個修改,
另外一個也會跟著修改