摘要:本文章記錄本人在深入學習執行上下文以及作用域鏈中看書理解到的一些東西,加深記憶和并且整理記錄下來,方便之后的復習。每個執行上下文都與一個作用域鏈關聯在一起。該對象的屬性的值是它被創建時的執行上下文對應的作用域鏈。
本文章記錄本人在深入學習執行上下文以及作用域鏈中看書理解到的一些東西,加深記憶和并且整理記錄下來,方便之后的復習。
執行上下文概念執行上下文,是ECMAScript規法中用來描述js代碼執行的抽象概念。所有的js代碼都是在某個執行上下文運行的。在一個執行上下文中調用一個函數,會進入一個新的執行上下文。調用結束就回到原來的執行上下文中。在函數調用的過程中,如果調用了其他的函數,那么將進入一個新的執行上下文,就會形成一個執行上下文棧。
每個執行上下文都與一個作用域鏈關聯在一起。該作用域鏈用來在函數執行時求出標識符的值。作用域鏈中包含許多的對象,在標識符進行求值的時候,先從鏈首開始,接著依次查找后面的對象,直到某個對象中的標示符名稱相等的屬性。
執行上下文順序在進入執行上下文時候,會按照順序執行下面的操作:
創建激活對象
激活對象是在進入執行上下文時候創建出來的,并且與新的執行上下文關聯在一起。在初始化構造函數的時候,該對象包含一個arguments屬性。激活對象在變量初始化也會用到。
創建作用域鏈
每一個函數都有一個內部屬性[[scope]],它的值是一個包含多個對象的鏈。這個屬性的具體指與函數的創建方式和代碼中的位置有很大的關系。這一步的操作是把上一步創建的激活對象添加到函數的[[scope]]屬性對應的鏈的前面。
變量初始化
對函數中需要用到的變量進行初始化。初始化時使用到的對象是前面創建的激活對象,不過這個時還不能稱作為變量對象。函數的實際參數、內部函數的局部變量是會被初始化的。局部變量是在變量對象創建的過程中創建了同名的屬性,這個屬性值為undefined,在函數執行的過程中才會被真正的賦值。
函數總是在自己的執行上下文環境中運行,例如讀/寫局部變量、函數參數,以及運行內部邏輯結構等等。創建上下文環境的過程中,js會遵守下面的規則:
根據調用時傳遞的參數創建調用對象。
創建參數對象,存儲參數變量。
創建對象屬性,存儲函數定義的布局變量。
把調用對象放在作用域鏈的頭部,方便檢索。
執行函數結構體的代碼。
返回函數的返回值。
作用域js中作用域又分為詞法作用域(定義作用域)和動態作用域。在函數還沒調用之前,根據函數結構的嵌套關系來確定函數的作用域。因此作用域取決于源代碼,通常編譯器可以進行靜態的分析來確定標示符的引用。
動態作用域
動態作用域(定義作用域),當函數被調用之后,其作用域會因為調用而發生變化,此時作用域鏈也會隨之調整。
詞法作用域(定義作用域)
詞法作用域(定義作用域)用來說明函數定義是存在的嵌套關系。當函數被執行的時候,作用域可能發生變化。js函數運行在它們的作用域中,而不是它們執行的作用域。
創建函數有3種方法,分別是:function函數聲明,function表達式和使用function構造器函數。使用不同的創建函數的方式,所scope屬性也會有所不同,從而影響函數執行過程中的作用域鏈。
使用函數聲明的函數對象是在進入執行上下文的時候變量初始化的過程中創建的。該對象的scope屬性的值是它被創建時的執行上下文對應的作用域鏈。
使用函數表達式的函數對象是在該表達式被執行的時候創建的。該對象的scope屬性的值與使用函數聲明創建的對象一樣。
使用函數構造器的聲明一個函數通常有兩種方式,常用的就是var funcName = new Function(x1, x2, ... xn),其中x1,x2 ..., xn表示的是該函數的形參,使用該方式的函數對象是在構造器調用的時候創建的。該對象的scope屬性的值一直是一個只包含全局對象的作用域鏈。
最后,如果文章有什么錯誤和疑問的地方,請指出。與sf各位共勉!目前是未完待續!!!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85662.html
摘要:在前端開發中閉包是一個很重要的知識點,是面試中一定會被問到的內容。閉包的用途閉包可以用在許多地方。這里僅僅是我對閉包的一些見解,若有錯誤的地方,還望大家提出,一起交流共同進步參考文獻你不知道的上卷深入理解系列 在前端開發中閉包是一個很重要的知識點,是面試中一定會被問到的內容。之前我對閉包的理解主要是通過閉包可以在函數外部能訪問到函數內部的變量,對閉包運用的也很少,甚至自己寫過閉包自己都...
摘要:下面我們就羅列閉包的幾個常見問題,從回答問題的角度來理解和定義你們心中的閉包。函數可以通過作用域鏈相互關聯起來,函數內部的變量可以保存在其他函數作用域內,這種特性在計算機科學文獻中稱為閉包。 寫這篇文章之前,我對閉包的概念及原理模糊不清,一直以來都是以通俗的外層函數包裹內層....來欺騙自己。并沒有說這種說法的對與錯,我只是不想擁有從眾心理或者也可以說如果我們說出更好更低層的東西,逼格...
摘要:示例當一個函數創建后,它的作用域鏈會被創建此函數的作用域中可訪問的數據對象填充。每一個運行期上下文都和一個作用域鏈關聯。此時,作用域鏈中函數的所有局部變量所在的作用域對象會被推后,訪問代價變高了。 作用域 作用域就是變量與函數的可訪問范圍,即作用域控制著變量與函數的可見性和生命周期。在JavaScript中,變量的作用域有全局作用域和局部作用域兩種。 作用域鏈 函數對象有一個內部屬性[...
摘要:寫在前面深入系列共計篇已經正式完結,這是一個旨在幫助大家,其實也是幫助自己捋順底層知識的系列。深入系列自月日發布第一篇文章,到月日發布最后一篇,感謝各位朋友的收藏點贊,鼓勵指正。 寫在前面 JavaScript 深入系列共計 15 篇已經正式完結,這是一個旨在幫助大家,其實也是幫助自己捋順 JavaScript 底層知識的系列。重點講解了如原型、作用域、執行上下文、變量對象、this、...
摘要:之前一篇文章我們詳細說明了變量對象,而這里,我們將詳細說明作用域鏈。而的作用域鏈,則同時包含了這三個變量對象,所以的執行上下文可如下表示。下圖展示了閉包的作用域鏈。其中為當前的函數調用棧,為當前正在被執行的函數的作用域鏈,為當前的局部變量。 showImg(https://segmentfault.com/img/remote/1460000008329355);初學JavaScrip...
閱讀 769·2021-11-23 09:51
閱讀 835·2021-11-23 09:51
閱讀 2503·2021-11-15 18:01
閱讀 3863·2021-10-11 11:07
閱讀 2396·2021-09-22 15:30
閱讀 1075·2021-09-22 14:59
閱讀 1557·2019-08-30 15:55
閱讀 1753·2019-08-30 15:52