亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript 作用域鏈解析

2019-11-20 13:55:47
字體:
來源:轉載
供稿:網友

JavaScript中有Scope(作用域),Scope chain(作用域鏈),Execute context(執行上下文),Active Object (活動對象),Dynamic Scope(動態作用域),Closure(閉包)這些概念,要理解這些概念,我們從靜態和動態兩個方面去分析一下。

首先我們寫一個簡單的function來做一個例子:

復制代碼 代碼如下:

function add(num1, num2){
var sum = num1 + num2;
return sum;
}

我們定義了一個具有兩個形參的add函數。

靜態方面:

當創建add函數的時候,Javascript引擎會創建add函數的Scope chain,這個作用域鏈指向了Global Context(全局上下文)。如果用圖形形象化的表述如下圖所示:

從上圖可以看出,當add函數創建的時候,作用域鏈就已經創建了,因此可以得出一個結論,函數的作用域鏈是創建函數的時候就已經創建了,而不是動態運行期。下面就來看看動態運行期的時候會發生什么事情。

動態方面:

當執行add函數的時候,JavaScript會創建一個Execute context(執行上下文),執行上下文中就包含了add函數運行期所需要的所有信息。Execute context也有自己的Scope chain,當函數運行的時候,JavaScript引擎會首先從用add函數的作用域鏈來初始化執行上下文的作用域鏈,然后JavaScript引擎又會創建一個Active Object,這個對象里面包含了函數運行期的所有局部變量,參數以及this等變量。

如果形象的描述add函數動態運行期會發生什么,可以用如下圖來描述:

從上圖可以看出,執行上下文是一個動態的概念,它是當函數運行的時候創建的,同時Active Object對象也是一個動態的概念,它是被執行上下文的作用域鏈引用的。因此可以得出一個結論:執行上下文和活動對象都是動態概念,并且執行上下文的作用域鏈是由函數作用域鏈初始化的。

上面說了函數作用域和執行上下文作用域,下面接著說一下動態作用域的問題,當在JavaScript通過with語句,try-catch的catch子句,以及eval方法的時候,JavaScript引擎就會動態的改變執行上下文的作用域。下面還是通過一個例子來看看:

復制代碼 代碼如下:

function initUI(){ 
  with (document){ //avoid! 
  var bd = body, 
  links = getElementsByTagName("a"), 
  i= 0, 
  len = links.length; 
  while(i < len){ 
  update(links[i++]); 

  getElementById("go-btn").onclick = function(){ 
  start(); 
}; 
  bd.className = "active"; 


當執行上面的initUI函數的時候,JavaScript會動態的創建一個with語句對應的作用域放到執行上下文作用域鏈的最前端,通過下圖可以形象的描述上述過程,下圖紅色標注的區域就顯示了with語句產生的作用域。

最后,我們來看看JavaScript最神秘的Closure(閉包),閉包在JavaScript其實就是一個函數,閉包是在函數運行期被創建的,下面還是以一個實例來看看:

復制代碼 代碼如下:

function assignEvents(){ 
    var id = "xdi9592"; 
    document.getElementById("save-btn").onclick = function(event){ 
    saveDocument(id); 
   }; 


當上面的assignEvents函數被執行的時候,會創建一個閉包,而這個閉包會引用assignEvents作用域中的id變量,如果按照傳統的編程語言的方式,id是存儲在堆棧上的一個變量,當函數執行完了以后id就消失,那么怎么可能再次引用呢?顯然這里JavaScript采用了另外的方式。下面就來看看JavaScript是如何來實現閉包的。當執行assignEvents函數的時候,JavaScript引擎會創建assignEvents函數執行上下文的作用域鏈,這個作用域鏈包含了assignEvents執行時的活動對象,而同時JavaScript引擎也會創建一個閉包,而閉包的作用域鏈也會引用assignEvent執行時候的活動對象,這樣當assignEvents執行完的時候,雖然它本身執行上下文的作用域鏈不再引用活動對象了,但是閉包還是引用著assignEvents運行期對應的活動對象,這就解釋了JavaScipt內部的閉包機制??梢杂孟聢D形象的表述上面assignEvents函數運行期的情形:

從上面可以看出,當assignEvents函數執行完畢以后,document.getElementById("save-btn").onclick引用了閉包,這樣當用戶點擊save-btn的時候,就會觸發閉包的執行,那么下面就來看看閉包執行時的情形。前面也說了JavaScript中閉包其實就是函數,因此閉包執行和函數執行時的情形是一致的,通過下圖來形象的描述上述onclick事件所關聯的閉包。

從上圖可以看出JavaScript引擎首先創建了閉包的執行上下文,然后用閉包作用域鏈來初始化閉包的執行上下文作用域鏈,最后再將閉包執行時對應的活動對象放入到作用域的最前端,這也進一步驗證了閉包就是函數的論斷。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情videoshd| 国产91对白在线播放| 一夜七次郎国产精品亚洲| 成人亚洲激情网| 国产69精品久久久| 国产精品jizz在线观看麻豆| 亚洲最大成人免费视频| 中文字幕亚洲一区二区三区| 91精品国产成人www| 日韩av色综合| 亚洲女人天堂av| 神马久久桃色视频| 欧美激情xxxxx| 26uuu亚洲国产精品| 久久久av网站| 亚洲情综合五月天| 在线观看日韩www视频免费| 亚洲www在线观看| 久久久久久久久久久91| 成人福利免费观看| 96国产粉嫩美女| 欧美最顶级的aⅴ艳星| 亚洲精品福利资源站| 日本成人免费在线| 国产狼人综合免费视频| 91精品久久久久| 国产精品久久久久久网站| 91在线网站视频| 成人网欧美在线视频| 欧美在线视频在线播放完整版免费观看| 亚洲欧美日韩在线高清直播| 亚洲视频在线观看| 色综合老司机第九色激情| 伊人精品在线观看| 91在线免费网站| 91中文字幕一区| 欧美极品第一页| 波霸ol色综合久久| 午夜精品久久久99热福利| 国产精品美女呻吟| 色偷偷av一区二区三区乱| 国产日产欧美a一级在线| 久久精品视频在线| 日韩高清电影免费观看完整版| 欧美富婆性猛交| 国产精品999999| 亚洲一区二区黄| 亚洲欧美日韩一区二区三区在线| 国产精品人成电影在线观看| 久久精品国产久精国产思思| 青青草精品毛片| 日韩高清电影免费观看完整| 69精品小视频| 日韩女优人人人人射在线视频| 国产精品女主播视频| 国产精品一区二区av影院萌芽| 欧洲永久精品大片ww免费漫画| 97高清免费视频| 91久久精品美女| 国产自摸综合网| 国产精品激情自拍| 全球成人中文在线| 久久国产精品免费视频| 亚洲男人天堂2023| 91精品国产91久久久久福利| 2020久久国产精品| 国产精品r级在线| 亚洲xxxx18| 91精品视频大全| 欧美性xxxx18| 国产精品久久中文| 亚洲一区亚洲二区| 国产精品爽爽爽| 神马久久久久久| 亚洲第一黄色网| 少妇高潮久久77777| 精品国产依人香蕉在线精品| 国产一区二区三区在线视频| 国产成人av在线播放| 国产精品福利在线| 成人黄色免费在线观看| 最新69国产成人精品视频免费| 欧美大片在线看免费观看| 91在线精品播放| 亚洲免费一级电影| 97视频国产在线| 亚洲老头老太hd| 亚洲成人网av| 欧美激情中文字幕在线| 91免费看国产| 欧美精品第一页在线播放| 国产精品∨欧美精品v日韩精品| 91精品久久久久久久久青青| 91久久久久久久| 国产丝袜一区二区三区| 久久精品一偷一偷国产| 欧美一级淫片videoshd| 亚洲人精品午夜在线观看| 国产精品国产福利国产秒拍| 日韩精品久久久久久福利| 亚洲嫩模很污视频| 欧美日韩国产成人| 成人激情在线观看| 亚洲视频欧美视频| 亚洲人成网在线播放| 欧美在线视频网站| 亚洲最大av在线| 欧美性生交xxxxxdddd| 亚洲第一男人av| 午夜免费久久久久| 黄色一区二区在线观看| 国产伊人精品在线| 91极品女神在线| 欧美成人黑人xx视频免费观看| 成人a免费视频| 欧美做受高潮电影o| 久久精品一区中文字幕| 91免费精品国偷自产在线| 久久69精品久久久久久国产越南| 亚洲天天在线日亚洲洲精| 欧美成在线视频| 中文字幕日本精品| 亚洲欧美国内爽妇网| 久久91精品国产91久久跳| 国产精品视频免费在线观看| 久久精品电影网站| 欧美精品18videosex性欧美| 精品国产一区二区在线| 国产在线视频一区| 91在线无精精品一区二区| 日韩大陆欧美高清视频区| 日产精品99久久久久久| 2020国产精品视频| 成人国产精品一区| 国产精品久久视频| 狠狠色狠狠色综合日日五| 成人美女免费网站视频| 国产精品久久久久久av福利软件| 欧美激情一区二区三级高清视频| 国内精品美女av在线播放| 欧美日韩免费观看中文| 亚洲剧情一区二区| 亚洲毛茸茸少妇高潮呻吟| 综合国产在线视频| 国产精品福利小视频| 成人午夜小视频| 国模精品视频一区二区| www日韩中文字幕在线看| 日韩在线免费高清视频| 久久精品这里热有精品| 欧美一级淫片aaaaaaa视频| 国产极品jizzhd欧美| 久久久精品欧美| 欧美日韩中文在线| 懂色av中文一区二区三区天美| 在线电影中文日韩| 亚洲国产中文字幕久久网| 国产精品久久久久久av福利| 日韩电影免费在线观看中文字幕| 国产精品视频自在线| 91精品国产高清久久久久久久久| 久久躁日日躁aaaaxxxx| 成人日韩在线电影| 亚洲高清一区二|