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