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