錯誤之處,歡迎指正。
1. 概念簡介
- 執(zhí)行上下文
是一個函數(shù)在運(yùn)行之前創(chuàng)建的一塊內(nèi)存空間,這個空間有該函數(shù)運(yùn)行所依賴的數(shù)據(jù)。 - 執(zhí)行上下文棧
是所有執(zhí)行上下文組成的空間,javascript會始終執(zhí)行棧頂?shù)膱?zhí)行上下文,直到全部執(zhí)行完畢。 - 全局執(zhí)行上下文
所有代碼執(zhí)行前,都必須有該環(huán)境。 - 函數(shù)執(zhí)行上下文
被執(zhí)行的函數(shù)創(chuàng)建的一塊內(nèi)存空間。
2. 例題
console.log('1');
function a() {
console.log('2');
function b() {
console.log('3');
}
b();
}
a();
console.log('4');
//輸出結(jié)果1 2 3 4
- 首先全局執(zhí)行上下文入棧。
- 然后從上而下,開始執(zhí)行代碼,首先執(zhí)行
console.log('1'),此時console.log('1')入棧,打印出了1,然后出棧。 - 繼續(xù)向下執(zhí)行,遇到了
a的定義,繼續(xù)向下執(zhí)行,遇到了a的執(zhí)行。 - 此時
a的執(zhí)行上下文入棧,首先執(zhí)行console.log('2'),此時console.log('2')入棧,打印出了2,然后出棧。 - 繼續(xù)向下執(zhí)行,遇到了
b的定義,繼續(xù)向下執(zhí)行,遇到了b的執(zhí)行。 - 此時
b的執(zhí)行上下文入棧,首先執(zhí)行console.log('3'),此時console.log('3')入棧,打印出了3,然后出棧。 - 此時
a執(zhí)行完畢,a的執(zhí)行上下文出棧。 - 繼續(xù)執(zhí)行全局上下文,遇到了
console.log('4'),此時console.log('4')入棧,打印出了4,然后出棧。 - 此時全局上下文執(zhí)行完畢,全局上下文出棧,執(zhí)行上下文棧為空,執(zhí)行結(jié)束。