欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

圖解JavaScript作用域鏈底層原理

 更新時間:2021年11月08日 15:08:05   作者:橙玉米  
當(dāng)代碼在一個環(huán)境中執(zhí)行時,會創(chuàng)建變量對象的一個作用域鏈,作用域鏈的用途是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問,下面這篇文章主要給大家介紹了關(guān)于JavaScript作用域鏈底層原理的相關(guān)資料,需要的朋友可以參考下

前言

在學(xué)習(xí)JavaScript時大家一定都知道,外部空間不能訪問內(nèi)部變量,我們往往只知道這一基本規(guī)則,那實(shí)現(xiàn)這一基本規(guī)則的基本底層原理是什么呢?今天我將從小白的角度來帶大家理解作用域鏈,希望能給大家一些幫助!

作用域

1.什么是作用域

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

2.[[Scopes]]屬性

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

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

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

3.作用域鏈

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

4.圖解查找變量原理

//以如下代碼為例說明JavaScript通過作用域鏈查找變量的原理**
function a() {
  function b() {
  //這里原來我給的b的值是234,后面經(jīng)過評論區(qū)提醒后面的圖寫的是123,所以我將b的值改為了123
      var b = 123;
  }
  var a = 123;
  b();
}
var glob = 100;

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

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

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

此時作用域鏈能夠第一個訪問的是Activation Object中的鍵值對,如果沒有才訪問全局對象

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

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

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

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

總結(jié)

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

到此這篇關(guān)于JavaScript作用域鏈底層原理的文章就介紹到這了,更多相關(guān)JavaScript作用域鏈內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

  • JS 實(shí)現(xiàn)百度搜索功能

    JS 實(shí)現(xiàn)百度搜索功能

    這篇文章給大家介紹了js實(shí)現(xiàn)百度搜索功能,代碼分為html部分和css折疊樣式部分,具體實(shí)現(xiàn)代碼大家參考下本文
    2018-02-02
  • JS實(shí)現(xiàn)顏色的10進(jìn)制轉(zhuǎn)化成rgba格式的方法

    JS實(shí)現(xiàn)顏色的10進(jìn)制轉(zhuǎn)化成rgba格式的方法

    這篇文章主要介紹了JS實(shí)現(xiàn)顏色的10進(jìn)制轉(zhuǎn)化成rgba格式的方法,涉及javascript針對顏色數(shù)值轉(zhuǎn)換的相關(guān)運(yùn)算操作技巧,需要的朋友可以參考下
    2017-09-09
  • JS限制輸入框輸入的實(shí)現(xiàn)代碼

    JS限制輸入框輸入的實(shí)現(xiàn)代碼

    這篇文章主要介紹了JS限制輸入框輸入的實(shí)現(xiàn)代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • Bootstrap模態(tài)框(modal)垂直居中的實(shí)例代碼

    Bootstrap模態(tài)框(modal)垂直居中的實(shí)例代碼

    這篇文章主要介紹了Bootstrap模態(tài)框(modal)垂直居中的實(shí)例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • js仿小米官網(wǎng)圖片輪播特效

    js仿小米官網(wǎng)圖片輪播特效

    這篇文章主要為大家詳細(xì)介紹了js仿小米官網(wǎng)圖片輪播特效,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 基于Three.js實(shí)現(xiàn)酷炫3D地圖效果

    基于Three.js實(shí)現(xiàn)酷炫3D地圖效果

    這篇文章主要為大家詳細(xì)介紹了如何利用Three.js實(shí)現(xiàn)酷炫3D地圖的效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以嘗試一下
    2022-10-10
  • JS Web Flex彈性盒子模型代碼實(shí)例

    JS Web Flex彈性盒子模型代碼實(shí)例

    這篇文章主要介紹了JS Web Flex彈性盒子模型代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • JS代碼隨機(jī)生成姓名、手機(jī)號、身份證號、銀行卡號

    JS代碼隨機(jī)生成姓名、手機(jī)號、身份證號、銀行卡號

    下面小編自己寫的一個js生成器代碼,代碼比較簡單,實(shí)用性非常高,感興趣的朋友一起學(xué)習(xí)吧
    2016-04-04
  • 查詢綁定數(shù)據(jù)島的表格中的文本并修改顯示方式的js代碼

    查詢綁定數(shù)據(jù)島的表格中的文本并修改顯示方式的js代碼

    查詢綁定數(shù)據(jù)島的表格中的文本并修改顯示方式的js代碼
    2009-12-12
  • 最新評論