當瀏覽器加載HTML頁面時畜晰,會產(chǎn)生一個供全局JS執(zhí)行的環(huán)境——>全局作用域(window、global object),在js執(zhí)行之前魄揉,瀏覽器會進行以下三個步驟:
? ? ? ? 1、語法分析拭宁;
? ? ? ? ?2洛退、預(yù)編譯;
? ? ? ? ?3杰标、解析執(zhí)行兵怯。
預(yù)編譯:在當前作用域中,js執(zhí)行之前瀏覽器默認會把帶有var和function的聲明進行提前的聲明或定義腔剂,其中
? ? ? ? ? ? var——>在預(yù)編譯時只是進行提前聲明媒区,值為undefined
? ? ? ? ? ? function——>在預(yù)編譯時進行提前聲明+定義
函數(shù)私有作用域預(yù)編譯四部曲:
網(wǎng)絡(luò)資源圖片
全局作用域預(yù)編譯:
????????1、創(chuàng)建GO對象(global object);
? ? ? ? 2掸犬、把帶有var和function的聲明進行提前的聲明或定義
注意點:
? ? ? ? 1袜漩、預(yù)編譯只對賦值表達式的左邊起作用,等號右邊的賦值不進行預(yù)編譯湾碎,例如函數(shù)表達式的右邊函數(shù)不在當前作用域進行預(yù)編譯宙攻。
? ? ? ? 2、return后面的函數(shù)在當前作用域不進行預(yù)編譯介褥。
? ? ? ? 3座掘、立即執(zhí)行函數(shù)在當前作用域不進行預(yù)編譯递惋。
? ? ? ? 4、代碼塊內(nèi)帶有var的聲明也會進行變量提升雹顺,無論條件是否成立丹墨,例如if語句中的var聲明。