概念一:執(zhí)行上下文猿涨;
概念二:變量對象握童;
概念三 ;內(nèi)存空間的概念叛赚。
執(zhí)行上下文澡绩,就是當(dāng)前代碼的運行環(huán)境。JS里的運行環(huán)境包括三種俺附,第一種是全局運行環(huán)境肥卡,第二種是函數(shù)運行環(huán)境,第三種eval事镣。一個JS程序中步鉴,會產(chǎn)生多個執(zhí)行上下文。
在JS中璃哟,我們可以粗淺低理解氛琢,所有的數(shù)據(jù)都放在堆內(nèi)存中,但是執(zhí)行上下文運行時随闪,卻是基于棧進(jìn)行處理艺沼。程序運行時,棧底永遠(yuǎn)是全局上下文蕴掏。然后依次是執(zhí)行過的函數(shù)上下文障般。
執(zhí)行上下文的生命周期有兩個階段,第一個是創(chuàng)建階段盛杰,這時候會創(chuàng)建一個變量對象挽荡,確定this的指向。第二個是代碼開始執(zhí)行的階段即供。
變量對象創(chuàng)建的時候定拟,會創(chuàng)建arguments對象。然后檢查函數(shù)聲明,在變量對象上以函數(shù)名創(chuàng)建一個屬性青自,屬性值指向?qū)瘮?shù)內(nèi)存地址的引用株依。在檢查變量的聲明,再在變量對象上以變量名創(chuàng)建一個屬性延窜,屬性值則為undefined恋腕。
而沒有進(jìn)入代碼執(zhí)行的階段,變量對象上的屬性都是不能訪問的逆瑞,代碼執(zhí)行之后荠藤,變量對象會變成活動對象。
所謂的變量提升获高,實際上就是這些哈肖。
(而變量對象和活動對象是一個對象,只不過處于執(zhí)行上下文生命周期的不同階段)