成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Javascript中閉包的作用域鏈

開發 前端
本文先闡述了閉包和作用域鏈的關系,然后分析了產生這些個問題的原因,一起來看。

作用域定義了在當前上下文中能夠被訪問到的成員,在Javascript中分為全局作用域和函數作用域,通過函數嵌套可以實現嵌套作用域。

閉包一般發生在嵌套作用域中。閉包是JavaScript最強大的特性之一,很多高級應用都要依靠閉包實現。如OO的私有成員和模塊化等。然而閉包雖然強大,但一般比較占用內存另外如果使用不當還會引起內存泄露,對閉包有了解的jser一般都知道閉包的這些個問題,本文先闡述了閉包和作用域鏈的關系,然后分析了產生這些個問題的原因。下面是一段閉包的示例代碼:

 

  1. var name = "windows's name";  
  2. var object = {  
  3. name : "object's name",  
  4. getNameFunc:function(){  
  5. var that = this;  
  6. return function(){  
  7. return that.name;  
  8. }  
  9. }  
  10. };  
  11. console.log(object.getNameFunc()()); 

 

當javascript代碼執行時會創建一個執行上下文對象,執行上下文對象包含一個作用域鏈,作用域鏈有一個或多個變量對象組成,作用域鏈中保存的是對變量對象的引用。變量對象定義了在當前作用域中聲明的變量和函數。

在代碼的執行過程中JAVASCRIPT引擎會按照自上而下的順序檢索作用鏈中的變量對象的成員來解析需要被訪問(讀或寫)的變量或函數,在檢索過程中如果在作用域鏈的某個變量對中象查找到與之匹配的標識符就會終止檢索。

通過這種方式當在代碼中如果有同名的變量就可以區分出來我們要操作那個變量。當代碼載入完成后 Javascript引擎會創建一個全局的執行上下文,全局執行上下文的作用域鏈只包含一個全局變量對象。Javascript的函數對象擁有一個私有的socpe屬性,當函數被創建時會使用當前的作用域鏈初始化函數scope屬性。

當函數被執行時會創建函數的執行上下文對象和當前作用域的變量對象,創建函數的執行上下文對象時先使用函數的scope屬性給執行上下文對象的作用域鏈賦值,再把創建的變量對象放入作用域鏈的頂端來初始化執行上下文的作用域鏈。位于作用域鏈頂端的變量對象也稱為活動對象。默認情況下當函數返回時會銷毀它的活動對象和作用域鏈,這也是為什么我們函數的外部不能夠訪問到在函數內部定義的成員。

然而在發生閉包的情況下,當內部函數被創建時,內部函數的scope屬性指向包含它的外部函數的作用域鏈。這時內部函數引用了外部函數的活動對象,當外部函數返回時,它的活動對象沒有被釋放,直到引用它的內部函數被銷毀時才會釋放外層函數的活動對象。所以它所包含的內部函數仍然可以訪問在外部函數中定義的成員,另外這也是閉包比較占用內存的原因。

內存泄露問題是由于部分瀏覽器使用引用計數來作為垃圾回收機制,當在我們的代碼中發生了循環引用時,就會造成資源不能被回收從而引起內存泄露。發生內存泄露有時是因為在我們的代碼中發生了明顯的循環引用,有時則不那么明顯。對于前者一般通過仔細檢查代碼就能發現問題所在,對于后者就需要我們對閉包有足夠的了解才能發現。如下面代碼:

  1. view sourceprint?function outerFunc(){  
  2. var obj = document.getElementById("element");  
  3. obj.onclick=function innerFunc(){  
  4. alert("Hi! I will leak");  
  5. };  
  6. obj.bigString=new Array(1000).join(new Array(3000).join("XXXXX"));  
  7. // This is used to make the leak significant  
  8. }; 

在上面這段代碼中,外部函數outerFunc中的局部變量obj引用文檔中ID為element的Dom元素,obj.onclick指向內部函數innerFunc的引用,內部函數innerFunc的scope屬性指向的作用鏈中包含外部函數outerFunc的活動對象的引用,活動對象的obj成員再次指向文檔中ID為element的Dom元素從而構成了循環引用。

【編輯推薦】

  1. 為你的網站添加上JavaScript禁用提示頁面吧
  2. 讓瀏覽器非阻塞加載javascript的幾種方式
  3. JavaScript實現二級聯動下拉框
  4. Javascript解決瀏覽器兼容性問題
責任編輯:于鐵 來源: web編程之路
相關推薦

2017-09-14 13:55:57

JavaScript

2021-12-06 07:15:48

Javascript作用域閉包

2015-08-18 13:42:42

js作用域鏈變量

2020-12-16 11:09:27

JavaScript語言開發

2020-02-12 16:58:15

JavaScript前端技術

2011-09-06 09:56:24

JavaScript

2019-03-13 08:00:00

JavaScript作用域前端

2012-11-29 10:09:23

Javascript閉包

2015-11-26 13:11:24

javascript原型鏈作用域

2021-02-21 16:21:19

JavaScript閉包前端

2021-06-02 07:02:42

js作用域函數

2016-09-14 09:20:05

JavaScript閉包Web

2009-07-24 17:30:37

Javascript閉

2021-03-09 08:35:51

JSS作用域前端

2020-10-14 15:15:28

JavaScript(

2011-05-25 14:48:33

Javascript閉包

2023-10-26 07:47:35

JavaScript代碼變量

2021-03-09 08:50:58

JavaScript前端作用域

2021-03-17 08:39:24

作用域作用域鏈JavaScript

2021-03-16 22:25:06

作用域鏈作用域JavaScript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕国产 | 91精品国产一区二区三区香蕉 | www国产成人免费观看视频,深夜成人网 | 亚洲视频在线一区 | 两性午夜视频 | 成人在线不卡 | 亚洲免费一区二区 | 伊人免费在线观看 | 韩日在线| 国产精品一区二区久久久久 | 7777奇米影视 | 蜜臀久久99精品久久久久久宅男 | 伊人成人免费视频 | 欧美一区二区三区久久精品 | 久久999| av在线一区二区三区 | 中文精品视频 | 国产精品一区三区 | 欧美精品一区在线发布 | 男女在线免费观看 | 中文字幕av高清 | 亚洲视频二区 | 精品国产高清一区二区三区 | 九一视频在线观看 | 欧美片网站免费 | 国产精品海角社区在线观看 | 亚洲色图综合网 | 国产一区在线看 | 欧美国产日韩在线观看成人 | 久久综合影院 | 久久久123| av免费电影在线 | 欧美三级视频在线观看 | 欧美日韩中文在线 | 中文字幕av网站 | 久久a久久 | 国产一级毛片视频 | 鸡毛片| 国产精品久久久久久久久久久久久 | 色精品| 色偷偷人人澡人人爽人人模 |