JavaScript中執(zhí)行上下文和執(zhí)行棧
執(zhí)行上下文?
執(zhí)行上下文是評估和執(zhí)行JavaScript代碼的環(huán)境的抽象概念。個人理解:js執(zhí)行的先后順序/函數(shù)或變量執(zhí)行的作用域等。
執(zhí)行上下文的類型
全局執(zhí)行上下文
任何不在函數(shù)內(nèi)部的代碼都在全局上下文中。它會執(zhí)行兩件事:創(chuàng)建全局對象Windows
(瀏覽器環(huán)境下),設(shè)置this
的值等于這個全局對象。一個程序中只會有一個全局執(zhí)行上下文。函數(shù)執(zhí)行上下文
每當一個函數(shù)被調(diào)用時,都會為該函數(shù)創(chuàng)建一個新的上下文,在函數(shù)調(diào)用時創(chuàng)建Eval函數(shù)執(zhí)行上下文
在eval函數(shù)內(nèi)部的代碼也會有屬于自己的執(zhí)行上下文
執(zhí)行棧
- 也就是編程語言中所說的“調(diào)用棧”,是一種LIFO(后進先出)的數(shù)據(jù)結(jié)構(gòu)棧,被用來存儲代碼運行時創(chuàng)建的所有執(zhí)行上下文。
- JavaScript引擎初次運行腳本時,會創(chuàng)建一個全局執(zhí)行上下文并且壓入當前執(zhí)行棧。每當引擎遇到一個函數(shù)調(diào)用,會為該函數(shù)創(chuàng)建一個新的執(zhí)行上下文并壓入棧頂部。
- 引擎會執(zhí)行上下文位于棧頂?shù)暮瘮?shù)。當該函數(shù)結(jié)束,從棧中彈出,控制流程到達當前棧中的下一個上下文。
創(chuàng)建執(zhí)行上下文
創(chuàng)建執(zhí)行上下文分為兩個階段
- 創(chuàng)建階段
- 執(zhí)行階段
在代碼執(zhí)行前,執(zhí)行上下文將經(jīng)歷創(chuàng)建階段,創(chuàng)建階段會發(fā)生三件事。
this
值的決定,也就是this
綁定- 創(chuàng)建
語法環(huán)境
組件 - 創(chuàng)建
變量環(huán)境
組件
this綁定
全局執(zhí)行上下文中,this
指向全局對象。(瀏覽器中,this
指Windows)
在函數(shù)
執(zhí)行上下文中,this
的值取決于該函數(shù)是如何被調(diào)用的。如果是被一個對象調(diào)用,那么this
會被設(shè)置成那個對象,否則this
的值被設(shè)置為全局對象、嚴格模式下(undefined
)
詞法環(huán)境
簡單來說
詞法環(huán)境
就是標識符
==>變量映射
的結(jié)構(gòu)。標識符:變量/函數(shù)的名字。變量:實際對象或原始
詞法環(huán)境
又分為
環(huán)境記錄器
:存儲變量和函數(shù)聲明的實際位置外部環(huán)境的引用
:它可以訪問父級詞法環(huán)境(作用域)
詞法環(huán)境
兩種類型
全局環(huán)境
(在全局環(huán)境執(zhí)行上下文)是沒有外部引用的,全局環(huán)境的外部環(huán)境引用為null
。全局環(huán)境擁有內(nèi)建的object/array、Windows等,還有任何用戶定義的全局變量,this
指向全局對象。- 在
函數(shù)環(huán)境
,函數(shù)內(nèi)部用戶定義的變量存儲在環(huán)境記錄器
。并且引用的外部環(huán)境可能是全局環(huán)境或任何包含此內(nèi)部函數(shù)的外部函數(shù)。
環(huán)境記錄器
聲明式環(huán)境記錄器
:存儲變量、函數(shù)和參數(shù)。對象環(huán)境記錄器
:用來定義出現(xiàn)在全局上下文
中的變量和函數(shù)關(guān)系。
到此這篇關(guān)于JavaScript中執(zhí)行上下文和執(zhí)行棧的文章就介紹到這了,更多相關(guān)JS執(zhí)行上下文內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript正則表達式校驗與遞歸函數(shù)實際應(yīng)用實例解析
這篇文章主要介紹了JavaScript正則表達式校驗與遞歸函數(shù)實際應(yīng)用,需要的朋友可以參考下2017-08-08詳細談?wù)凟S6中的symbol數(shù)據(jù)類型
這篇文章主要給大家介紹了關(guān)于ES6中symbol數(shù)據(jù)類型的相關(guān)資料,Symbol函數(shù)的特性是每一個Symbol函數(shù)的返回值都是唯一的,可以通過給symbol函數(shù)傳遞不同的參數(shù)產(chǎn)生具有不同標記的值,需要的朋友可以參考下2021-08-08JS中的算法與數(shù)據(jù)結(jié)構(gòu)之鏈表(Linked-list)實例詳解
這篇文章主要介紹了JS中的算法與數(shù)據(jù)結(jié)構(gòu)之鏈表(Linked-list),結(jié)合實例形式詳細分析了javascript中鏈表的概念、原理、定義及常用操作技巧,需要的朋友可以參考下2019-08-08父元素與子iframe相互獲取變量和元素對象的具體實現(xiàn)
父元素與子iframe相互獲取變量和元素對象的方法有很多,本文提供了一些不錯的示例另收集網(wǎng)上的一些,可以參考下2013-10-10JavaScript navigator.userAgent獲取瀏覽器信息案例講解
這篇文章主要介紹了JavaScript navigator.userAgent獲取瀏覽器信息案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08