本篇文章一步一步帶你深入理解JavaScript中的執行上下文。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
只有了解執行上下文,才能更能理解JavaScript 語言本身,例如變數提升,作用域,閉包等
執行上下文是目前程式碼的執行環境。
全域執行上下文:全域執行環境是最外圍的一個執行環境,在瀏覽器的全域物件是window, this指向這個物件
函數執行上下文:可以有無數個,函數被呼叫的時候會被建立。每次呼叫函數都會建立一個新的執行上下文。
eval執行上下文,很少用。
#變數物件(variable object, VO): 每個執行環境都有一個與之關聯的變數對象,環境中定義的所有變數和函數都保存在這個物件中。雖然我們寫的程式碼無法存取這個對象,但解析器在處理資料時會在後台使用它。
在函數上下文中,使用活動物件 (activation object, AO) 來表示變數物件。活動物件和變數物件其實是一個東西,只有當進入一個執行環境時,這個執行上下文的變數物件才會被激活,此時稱為 活動物件(AO),只有活動物件上的屬性才能被存取。
作用域鏈(scope chain):當程式碼在一個環境中執行時,會建立變數物件的一個作用域鏈。作用域鏈的用途,是保證對執行環境有權存取的所有變數和函數的有序存取。
this
舉個簡單的例子來理解變數物件
function getName(name) { var b = 2; function foo() {}; var bar = function() {}; } getName('lucystar')
此時的AO 大致如下從JS底層理解var、let、const上面例子中涉及到了變數提升和函數提升,之前在AO = { arguments: { 0: 'lucystar', length: 1 }, name: 'lucystar', b: undefined, foo: reference to function foo(){}, bar: undefined }登入後複製
執行上下文出棧被垃圾回收機制回收。關於記憶體回收的內容,可以查看
V8記憶體管理及垃圾回收機制執行上下文堆疊是用來管理執行上下文的。在執行上下文創建好後,JavaScript引擎會將執行上下文壓入到堆疊中,通常會將這種用來管理執行上下文的堆疊稱為執行上下文棧,又稱為呼叫堆疊。
let a = 'javascript'; function foo() { console.log('foo'); bar(); } function bar() { console.log('bar'); } foo();
當遇到
當從
foo()
函數內部呼叫
當函數bar 執行完畢,它的執行上下文會從目前堆疊中彈出,控制流程到達下一個執行上下文,即
為什麼基本資料類型儲存在堆疊中,並引用資料類型儲存在堆中? JavaScript引擎需要用堆疊來維護程式執行期間的上下文的狀態,如果棧空間大了的話,所有資料都存放在堆疊空間裡面,會影響到上下文切換的效率,進而影響整個程式的執行效率。
更多程式相關知識,請造訪:程式設計影片! !
以上是手把手教你理解JS中的執行上下文的詳細內容。更多資訊請關注PHP中文網其他相關文章!