站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

JavaScript底層原理之作用域鏈(圖文詳解)

本篇文章給大家?guī)?lái)了JavaScript中作用域鏈的相關(guān)知識(shí),外部空間不能訪問(wèn)內(nèi)部變量,我們往往只知道這一基本規(guī)則,那實(shí)現(xiàn)這一基本規(guī)則的基本底層原理是什么呢?希望能給大家一些幫助!

JavaScript底層原理之作用域鏈(圖文詳解)

作用域

1.什么是作用域

簡(jiǎn)單來(lái)說(shuō),作用域(英文:scope)是據(jù)名稱來(lái)查找變量的一套規(guī)則,可以把作用域通俗理解為一個(gè)封閉的空間,這個(gè)空間是封閉的,不會(huì)對(duì)外部產(chǎn)生影響,外部空間不能訪問(wèn)內(nèi)部空間,但是內(nèi)部空間可以訪問(wèn)將其包裹在內(nèi)的外部空間。

2.[[Scopes]]屬性

在javascript中,每個(gè)函數(shù)都是一個(gè)對(duì)象,在對(duì)象中有些屬性我們可以訪問(wèn),有些我們是不能自由訪問(wèn)的,[[Scopes]]屬性就是其中之一,這個(gè)屬性只能被JavaScript引擎讀取。

其實(shí)[[scope]]就是我們常說(shuō)的作用域,其中存儲(chǔ)了作用域運(yùn)行期的上下文集合。

在這里因?yàn)閒unc.prototype.constructor和func指向同一個(gè)函數(shù),所以在這里我們通過(guò)訪問(wèn)函數(shù)func的原型對(duì)象來(lái)查看[[Scopes]]屬性

JavaScript底層原理之作用域鏈(圖文詳解)

3.作用域鏈

[[scope]]中存儲(chǔ)的執(zhí)行期的上下文對(duì)象的集合,這個(gè)集合呈鏈?zhǔn)竭B接,我們把這種鏈?zhǔn)竭B接叫做作用域鏈。JavaScript正是通過(guò)作用域鏈來(lái)查找變量的,其查找方式是沿著作用域鏈的頂端依次向下查詢(在哪個(gè)函數(shù)內(nèi)部查找對(duì)象,就在哪個(gè)函數(shù)作用域鏈中查找)

4.圖解查找變量原理

//以如下代碼為例說(shuō)明JavaScript通過(guò)作用域鏈查找變量的原理** function a() {   function b() {       var b = 123;   }   var a = 123;   b(); } var glob = 100;

1.當(dāng)全局函數(shù)a()被定義時(shí),作用域鏈如下

JavaScript底層原理之作用域鏈(圖文詳解)

函數(shù)的[[Scopes]]屬性指向作用域鏈對(duì)象,此時(shí)作用域鏈只有一個(gè)鍵值對(duì),這個(gè)鍵值對(duì)指向全局對(duì)象,全局對(duì)象存儲(chǔ)了全局下可以訪問(wèn)的東西,也就是最外層作用域,大家都可以訪問(wèn)的。

2.當(dāng)全局函數(shù)a()被激活調(diào)用時(shí),作用域鏈如下

JavaScript底層原理之作用域鏈(圖文詳解)

此時(shí)作用域鏈能夠第一個(gè)訪問(wèn)的是Activation Object中的鍵值對(duì),如果沒(méi)有才訪問(wèn)全局對(duì)象

3.函數(shù)a()中函數(shù)b被定義時(shí),b的作用域鏈如下

JavaScript底層原理之作用域鏈(圖文詳解)

當(dāng)b只是被定義沒(méi)有被調(diào)用時(shí),b的作用域鏈和a是相同的

4.當(dāng)函數(shù)a()中的函數(shù)b被激活調(diào)用時(shí),作用域鏈如下

JavaScript底層原理之作用域鏈(圖文詳解)

作用域鏈最先指向函數(shù)b()的Activation Object,查找變量也是按作用域鏈順序訪問(wèn),找到就停止

5.總結(jié)

之所以外部作用域不能訪問(wèn)內(nèi)部作用域的原因是外部作用域的作用域鏈沒(méi)有內(nèi)部作用域的Activation Object,所以無(wú)法訪問(wèn)內(nèi)部變量,內(nèi)部作用域訪問(wèn)變量的順序是按照作用域鏈,先從里面查找,沒(méi)有就沿著作用域鏈向外找,外部是全局作用域

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久99国产精品久久99| 久久国产热这里只有精品| 思思re热免费精品视频66| 99热精品国产三级在线观看| 精品久久香蕉国产线看观看亚洲| 精品精品国产国产| 51午夜精品免费视频| 亚洲日韩精品无码专区加勒比☆| 国产精品国产三级国快看| 精品无码国产一区二区三区51安| 国产成人精品日本亚洲11| 亚洲精品福利网站| 精品一区二区三区无码免费视频| 久久久久免费精品国产小说| 久久91精品国产91久久小草| 99热成人精品热久久669| 国内精品久久久久久久久 | 国产亚洲精品高清在线| 亚洲欧洲自拍拍偷精品 美利坚| 日韩精品一区二区三区老鸦窝| 国产 日韩 中文字幕 制服| 亚洲日韩精品射精日| 日韩精品久久久久久| 日韩精品一区二区三区四区 | 日韩精品久久不卡中文字幕 | 一区二区三区国产精品| 久久精品国产精油按摩| 久久精品视频久久| 久久一本精品久久精品66| 无码精品国产一区二区三区免费| 久久99热精品免费观看动漫| 香蕉国产精品频视| 精品无码AV无码免费专区| 91亚洲精品自在在线观看| 亚洲欧洲久久精品| 国产成人精品1024在线| 国产精品综合AV一区二区国产馆 | 国产在视频线在精品| 国产在线精品二区赵丽颖| 日韩精品无码一本二本三本| 日韩一级电影在线观看|