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