寫在前面:前段時間參加了金山的前端面試,面試過程當中常常get不到面試官的點,有時候即便理解了面試官的意思,卻又不能準確的表達出來。讓我意識到當前最大的問題是表達溝通能力不足。因此指望經過撰寫學習文檔的方式,來提高本身的表達和總結的能力。前端
執行上下文是指當前Javascript代碼被解析和執行時所在環境的抽象概念,JavaScript 任何代碼的運行都是在執行上下文中。面試
js代碼運行在執行棧中,執行棧也叫作調用棧,具備後進先出的棧結構,用於存儲js代碼在執行過程當中建立的上下文環境。數組
<script>
baz();
foo();
function baz() {
console.log('in baz, we canot get bar: ', bar);
}
</script>
<script>
function foo() {
console.log('in foo, wen can get bar: ', bar);
}
foo();
var bar = 1;
baz();
</script>
複製代碼
Uncaught ReferenceError: bar is not defined
。而後終止函數執行,將baz執行上下文移除。bar = undefined; foo: fun
bar = 1
賦值操做,而後執行函數baz。將建立baz執行上下文,由於只存在一個全局執行上下文,因此此時baz的外部環境對象的引用包括已經賦值的bar變量,因此會輸出1。執行完畢,移除baz上下文。執行上下文分爲兩個階段,建立階段和執行階段。bash
建立階段主要完成三件事情。閉包
根據當前函數的執行環境來綁定函數的this值,好比做爲對象屬性調用,this的值將被綁定到對象實例上。函數
定義:詞法環境是一種規範類型,基於 ECMAScript 代碼的詞法嵌套結構來定義標識符與特定變量和函數的關聯關係。詞法環境由環境記錄(environment record)和可能爲空引用(null)的外部詞法環境組成。post
詞法環境的組成 詞法環境分爲兩個部分:環境記錄;對外部環境的引用。學習
詞法環境分爲兩種:
1)全局環境:在全局執行上下文中,是一個沒有外部環境的詞法環境。其外部引用爲null。它擁有一個全局對象(window 對象)及其關聯的方法和屬性(例如數組方法)以及任何用戶自定義的全局變量,this 的值指向這個全局對象。
2)函數環境:用戶在函數中定義的變量被存儲在環境記錄中,其外部引用能夠是函數環境也能夠是全局環境。對於函數環境而言,還包含一個arguments對象,該對象包含函數參數的引用,是一個類數組結構,如this
function foo(a, b) {
var c = a + b;
}
foo(2, 3);
// arguments 對象
Arguments: {0: 2, 1: 3, length: 2}
複製代碼
環境變量分爲兩種spa
變量環境也是詞法法環境,用於存儲var聲明的變量。
執行上下文在建立階段,會掃描並解析變量和函數聲明。其中函數聲明存儲在環境中,而變量會被設置爲 undefined(在 var 的狀況下)或保持未初始化(在 let 和 const 的狀況下)。這就是所謂的聲明提高
在此階段,完成對全部變量的分配,最後執行代碼。若是找不到let變量的值,將會爲其分配undefined。
理解函數執行上下文,可讓咱們知道一段js代碼按照什麼樣的順序被執行和調用。有助於咱們理解聲明提高,閉包,函數做用域,this綁定等等概念。歸納起來就是: