執(zhí)行上下文
執(zhí)行上下文是當(dāng)前JavaScript被解析和運(yùn)行時所在環(huán)境的抽象概念。
執(zhí)行上下文的類型
- 全局執(zhí)行上下文:只有一個,瀏覽器的全局對象就是windows對象库正,this指向這個對象雳灵。
- 函數(shù)執(zhí)行上下文:只有在函數(shù)被調(diào)用的時候才會被創(chuàng)建哗脖。每次調(diào)用函數(shù)都會創(chuàng)建一個新的函數(shù)執(zhí)行上下文祈餐。
- eval執(zhí)行上下文:運(yùn)行在eval函數(shù)中的代碼擂啥。
執(zhí)行棧
執(zhí)行棧,也叫任務(wù)棧帆阳。具有LIFO(后進(jìn)先出)的結(jié)構(gòu)哺壶。用于存儲代碼運(yùn)行期間創(chuàng)建的所有執(zhí)行上下文。
- 首次運(yùn)行代碼時蜒谤,會創(chuàng)建一個全局的執(zhí)行上下文山宾,并push到執(zhí)行棧中。每當(dāng)發(fā)生函數(shù)調(diào)用鳍徽,都會創(chuàng)建一個函數(shù)執(zhí)行上下文资锰,并push到當(dāng)前的執(zhí)行棧中。
- 根據(jù)任務(wù)棧LIFO的結(jié)構(gòu)阶祭,當(dāng)棧頂函數(shù)調(diào)用完畢后绷杜,會從執(zhí)行棧的棧頂pop出這個函數(shù)的函數(shù)執(zhí)行上下文。上下文控制權(quán)會移交給下一個執(zhí)行上下文胖翰。
function first() {
console.log('Inside first function');
second();
console.log('Again inside first function');
}
function second() {
console.log('Inside second function');
}
first();
console.log('Inside Global Execution Context');
// Inside first function
// Inside second function
// Again inside first function
// Inside Global Execution Context
執(zhí)行上下文的創(chuàng)建
執(zhí)行上下文分為兩個階段進(jìn)行創(chuàng)建:1.創(chuàng)建階段接剩,2.執(zhí)行階段
創(chuàng)建階段
- 確定 this 的值,也就是 this binding
- LexicalEnvironment(詞法環(huán)境) 組件被創(chuàng)建萨咳。
- VariableEnvironment(變量環(huán)境) 組件被創(chuàng)建懊缺。