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

Javascript中閉包的作用域鏈

開(kāi)發(fā) 前端
本文先闡述了閉包和作用域鏈的關(guān)系,然后分析了產(chǎn)生這些個(gè)問(wèn)題的原因,一起來(lái)看。

作用域定義了在當(dāng)前上下文中能夠被訪問(wèn)到的成員,在Javascript中分為全局作用域和函數(shù)作用域,通過(guò)函數(shù)嵌套可以實(shí)現(xiàn)嵌套作用域。

閉包一般發(fā)生在嵌套作用域中。閉包是JavaScript最強(qiáng)大的特性之一,很多高級(jí)應(yīng)用都要依靠閉包實(shí)現(xiàn)。如OO的私有成員和模塊化等。然而閉包雖然強(qiáng)大,但一般比較占用內(nèi)存另外如果使用不當(dāng)還會(huì)引起內(nèi)存泄露,對(duì)閉包有了解的jser一般都知道閉包的這些個(gè)問(wèn)題,本文先闡述了閉包和作用域鏈的關(guān)系,然后分析了產(chǎn)生這些個(gè)問(wèn)題的原因。下面是一段閉包的示例代碼:

 

  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()()); 

 

當(dāng)javascript代碼執(zhí)行時(shí)會(huì)創(chuàng)建一個(gè)執(zhí)行上下文對(duì)象,執(zhí)行上下文對(duì)象包含一個(gè)作用域鏈,作用域鏈有一個(gè)或多個(gè)變量對(duì)象組成,作用域鏈中保存的是對(duì)變量對(duì)象的引用。變量對(duì)象定義了在當(dāng)前作用域中聲明的變量和函數(shù)。

在代碼的執(zhí)行過(guò)程中JAVASCRIPT引擎會(huì)按照自上而下的順序檢索作用鏈中的變量對(duì)象的成員來(lái)解析需要被訪問(wèn)(讀或?qū)?的變量或函數(shù),在檢索過(guò)程中如果在作用域鏈的某個(gè)變量對(duì)中象查找到與之匹配的標(biāo)識(shí)符就會(huì)終止檢索。

通過(guò)這種方式當(dāng)在代碼中如果有同名的變量就可以區(qū)分出來(lái)我們要操作那個(gè)變量。當(dāng)代碼載入完成后 Javascript引擎會(huì)創(chuàng)建一個(gè)全局的執(zhí)行上下文,全局執(zhí)行上下文的作用域鏈只包含一個(gè)全局變量對(duì)象。Javascript的函數(shù)對(duì)象擁有一個(gè)私有的socpe屬性,當(dāng)函數(shù)被創(chuàng)建時(shí)會(huì)使用當(dāng)前的作用域鏈初始化函數(shù)scope屬性。

當(dāng)函數(shù)被執(zhí)行時(shí)會(huì)創(chuàng)建函數(shù)的執(zhí)行上下文對(duì)象和當(dāng)前作用域的變量對(duì)象,創(chuàng)建函數(shù)的執(zhí)行上下文對(duì)象時(shí)先使用函數(shù)的scope屬性給執(zhí)行上下文對(duì)象的作用域鏈賦值,再把創(chuàng)建的變量對(duì)象放入作用域鏈的頂端來(lái)初始化執(zhí)行上下文的作用域鏈。位于作用域鏈頂端的變量對(duì)象也稱(chēng)為活動(dòng)對(duì)象。默認(rèn)情況下當(dāng)函數(shù)返回時(shí)會(huì)銷(xiāo)毀它的活動(dòng)對(duì)象和作用域鏈,這也是為什么我們函數(shù)的外部不能夠訪問(wèn)到在函數(shù)內(nèi)部定義的成員。

然而在發(fā)生閉包的情況下,當(dāng)內(nèi)部函數(shù)被創(chuàng)建時(shí),內(nèi)部函數(shù)的scope屬性指向包含它的外部函數(shù)的作用域鏈。這時(shí)內(nèi)部函數(shù)引用了外部函數(shù)的活動(dòng)對(duì)象,當(dāng)外部函數(shù)返回時(shí),它的活動(dòng)對(duì)象沒(méi)有被釋放,直到引用它的內(nèi)部函數(shù)被銷(xiāo)毀時(shí)才會(huì)釋放外層函數(shù)的活動(dòng)對(duì)象。所以它所包含的內(nèi)部函數(shù)仍然可以訪問(wèn)在外部函數(shù)中定義的成員,另外這也是閉包比較占用內(nèi)存的原因。

內(nèi)存泄露問(wèn)題是由于部分瀏覽器使用引用計(jì)數(shù)來(lái)作為垃圾回收機(jī)制,當(dāng)在我們的代碼中發(fā)生了循環(huán)引用時(shí),就會(huì)造成資源不能被回收從而引起內(nèi)存泄露。發(fā)生內(nèi)存泄露有時(shí)是因?yàn)樵谖覀兊拇a中發(fā)生了明顯的循環(huán)引用,有時(shí)則不那么明顯。對(duì)于前者一般通過(guò)仔細(xì)檢查代碼就能發(fā)現(xiàn)問(wèn)題所在,對(duì)于后者就需要我們對(duì)閉包有足夠的了解才能發(fā)現(xiàn)。如下面代碼:

  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. }; 

在上面這段代碼中,外部函數(shù)outerFunc中的局部變量obj引用文檔中ID為element的Dom元素,obj.onclick指向內(nèi)部函數(shù)innerFunc的引用,內(nèi)部函數(shù)innerFunc的scope屬性指向的作用鏈中包含外部函數(shù)outerFunc的活動(dòng)對(duì)象的引用,活動(dòng)對(duì)象的obj成員再次指向文檔中ID為element的Dom元素從而構(gòu)成了循環(huán)引用。

【編輯推薦】

  1. 為你的網(wǎng)站添加上JavaScript禁用提示頁(yè)面吧
  2. 讓瀏覽器非阻塞加載javascript的幾種方式
  3. JavaScript實(shí)現(xiàn)二級(jí)聯(lián)動(dòng)下拉框
  4. Javascript解決瀏覽器兼容性問(wèn)題
責(zé)任編輯:于鐵 來(lái)源: web編程之路
相關(guān)推薦

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語(yǔ)言開(kāi)發(fā)

2020-02-12 16:58:15

JavaScript前端技術(shù)

2019-03-13 08:00:00

JavaScript作用域前端

2011-09-06 09:56:24

JavaScript

2012-11-29 10:09:23

Javascript閉包

2015-11-26 13:11:24

javascript原型鏈作用域

2021-02-21 16:21:19

JavaScript閉包前端

2016-09-14 09:20:05

JavaScript閉包Web

2009-07-24 17:30:37

Javascript閉

2021-06-02 07:02:42

js作用域函數(shù)

2021-03-09 08:35:51

JSS作用域前端

2020-10-14 15:15:28

JavaScript(

2011-05-25 14:48:33

Javascript閉包

2021-03-09 08:50:58

JavaScript前端作用域

2010-06-23 10:24:42

Javascript閉

2016-09-18 20:53:16

JavaScript閉包前端

2023-10-26 07:47:35

JavaScript代碼變量
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91久久国产综合久久 | 玖玖视频| 国产精品视频网 | 97人澡人人添人人爽欧美 | 成人激情视频免费观看 | 精品国产91| 91精品国产综合久久久久蜜臀 | 中文成人无字幕乱码精品 | 成人午夜视频在线观看 | 亚洲欧美网站 | 在线免费国产视频 | 91日韩| a在线v| 亚洲免费人成在线视频观看 | 在线免费国产视频 | 337p日本欧洲亚洲大胆精蜜臀 | 日本五月婷婷 | 岛国毛片在线观看 | 久久久久久久久久久久久91 | 日韩三级电影一区二区 | aaa一区 | 韩日一区二区 | 亚洲欧美精 | 久久综合一区二区三区 | 国产性网 | 久久爱综合 | 国产精品一区二区视频 | 亚洲成人www| 欧美性高潮| 亚洲bt 欧美bt 日本bt | 伊人免费观看视频 | 中文字幕高清免费日韩视频在线 | 成人二区 | 天天干天天爱天天爽 | 日韩午夜精品 | 国产日韩在线观看一区 | 久久尤物免费一区二区三区 | 免费在线观看成年人视频 | 成人国产在线视频 | 亚洲最大福利网 | 亚洲国产午夜 |