摘要:作用域負(fù)責(zé)收集并維護由所有聲明的標(biāo)識符變量組成的一系列查詢,并實施一套非常嚴(yán)格的規(guī)則,確定當(dāng)前執(zhí)行的代碼對這些標(biāo)識符的訪問權(quán)限。異常查詢在所有嵌套作用域中無法遍尋到所需的變量,引擎就會拋出異常對所操作的變量進行非法或者不合理操作
1.作用域是什么? 1.1 編譯原理
分詞/詞法分析,將字符組成的字符串分解成有意思的代碼塊,這些代碼塊稱為詞法單元:
var a = 2; // 代碼會被分成右面這些詞法單元:var、a、=、2、;
解析/語法分析,將詞法單元流轉(zhuǎn)換成一個由元素逐級嵌套所組成的代表了程序語法結(jié)構(gòu)的樹,"抽象語法樹"(Abstract Syntax tree, AST)
代碼生成,將AST轉(zhuǎn)換為可執(zhí)行代碼的過程被稱為代碼生成。
??當(dāng)var a = 2;有某種方法將里面的AST轉(zhuǎn)化為一組機器指令,用來創(chuàng)建一個叫做a的變量(包括分配內(nèi)存等),并將一個值儲存在a中。
對于JavaScript來說,大部分編譯發(fā)生在代碼執(zhí)行前的幾微秒。
1.2 理解作用域引擎:從頭到尾負(fù)責(zé)整個JavaScript程序的編譯與執(zhí)行過程。
編譯器:負(fù)責(zé)語法分析及代碼生成等。
作用域:負(fù)責(zé)收集并維護由所有聲明的標(biāo)識符(變量)組成的一系列查詢,并實施一套非常嚴(yán)格的規(guī)則,確定當(dāng)前執(zhí)行的代碼對這些標(biāo)識符的訪問權(quán)限。
總結(jié):變量賦值:首先編譯器會在當(dāng)前作用域中聲明一個變量,然后在運行時引擎會在作用域中查找該變量,找到及賦值。
LHS查詢:試圖找到變量的容器本身,從而對其賦值。
RHS查詢:查找某個變量的值。
function foo(a) { console.log(a); //2 } foo(2)
步驟解析:
引擎為foo進行RHS引用
作用域給引擎這個foo的值。
引擎執(zhí)行foo
引擎對a進行LHS引用
作用域把foo里面的形式參數(shù)a給引擎
2賦值給a
為console進行RHS引用
為a進行RHS引用
1.3 作用域嵌套遍歷嵌套作用域鏈:引擎從當(dāng)前的執(zhí)行作用域開始查找變量,找不到則到上一級去查找,當(dāng)?shù)诌_(dá)最后一層全局作用域時,則強制停止。
1.4 異常ReferenceError:RHS查詢在所有嵌套作用域中無法遍尋到所需的變量,引擎就會拋出ReferenceError異常
TypeErroe: 對所操作的變量進行非法或者不合理操作
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/92614.html
摘要:全局作用域局部作用域局部作用域全局作用域局部作用域塊語句沒有塊級作用域塊級聲明包括和,以及和循環(huán),和函數(shù)不同,它們不會創(chuàng)建新的作用域。局部作用域只在該函數(shù)調(diào)用執(zhí)行期間存在。 一、什么是作用域? 作用域是你的代碼在運行時,各個變量、函數(shù)和對象的可訪問性。(可產(chǎn)生作用的區(qū)域) 二、JavaScript中的作用域 在 JavaScript 中有兩種作用域 全局作用域 局部作用域 當(dāng)變量定...
摘要:一言以蔽之,閉包,你就得掌握。當(dāng)函數(shù)記住并訪問所在的詞法作用域,閉包就產(chǎn)生了。所以閉包才會得以實現(xiàn)。從技術(shù)上講,這就是閉包。執(zhí)行后,他的內(nèi)部作用域并不會消失,函數(shù)依然保持有作用域的閉包。 網(wǎng)上總結(jié)閉包的文章已經(jīng)爛大街了,不敢說筆者這篇文章多么多么xxx,只是個人理解總結(jié)。各位看官瞅瞅就好,大神還希望多多指正。此篇文章總結(jié)與《JavaScript忍者秘籍》 《你不知道的JavaScri...
摘要:最近剛剛看完了你不知道的上卷,對有了更進一步的了解。你不知道的上卷由兩部分組成,第一部分是作用域和閉包,第二部分是和對象原型。附錄詞法這一章并沒有說明機制,只是介紹了中的箭頭函數(shù)引入的行為詞法。第章混合對象類類理論類的機制類的繼承混入。 最近剛剛看完了《你不知道的 JavaScript》上卷,對 JavaScript 有了更進一步的了解。 《你不知道的 JavaScript》上卷由兩部...
摘要:關(guān)于循環(huán)和閉包當(dāng)循環(huán)和閉包結(jié)合在一起時,經(jīng)常會產(chǎn)生讓初學(xué)者覺得匪夷所思的問題。閉包是一把雙刃劍是比較難以理解和掌握的部分,它十分強大,卻也有很大的缺陷,如何使用它完全取決于你自己。 在談閉包之前,我們首先要了解幾個概念: 什么是函數(shù)表達(dá)式? 與函數(shù)聲明有何不同? JavaScript查找標(biāo)識符的機制 JavaScript的作用域是詞法作用域 JavaScript的垃圾回收機制 先來...
摘要:當(dāng)被創(chuàng)建時,它的作用域鏈初始化為當(dāng)前運行函數(shù)的屬性中的對象,這些值按照他們出現(xiàn)在函數(shù)中的順序,被復(fù)制到執(zhí)行環(huán)境的作用域鏈中。然后這個對象被推入作用域鏈最前端。 在計算機科學(xué)中,數(shù)據(jù)存儲的位置關(guān)系到代碼執(zhí)行過程中數(shù)據(jù)的檢索速度,有一個經(jīng)典的問題即為:通過改變數(shù)據(jù)的存儲位置來獲得最佳的讀寫性能。 Javascript中四種基本的數(shù)據(jù)存儲位置 字面量字面量只代表自身,不存儲在特定的位置。...
摘要:操作符或調(diào)用函數(shù)時傳入?yún)?shù)的操作都會導(dǎo)致關(guān)聯(lián)作用域的賦值操作。此外可以使用和來設(shè)置對象及其屬性的不可變性級別。忽視這一點會導(dǎo)致許多問題。使用調(diào)用函數(shù)時會把新對象的屬性關(guān)聯(lián)到其他對象。 前言 《你不知道的 javascript》是一個前端學(xué)習(xí)必讀的系列,讓不求甚解的JavaScript開發(fā)者迎難而上,深入語言內(nèi)部,弄清楚JavaScript每一個零部件的用途。本書介紹了該系列的兩個主題:...
閱讀 4028·2021-11-22 13:53
閱讀 1729·2021-09-23 11:52
閱讀 2445·2021-09-06 15:02
閱讀 955·2019-08-30 15:54
閱讀 911·2019-08-30 14:15
閱讀 2392·2019-08-29 18:39
閱讀 663·2019-08-29 16:07
閱讀 427·2019-08-29 13:13