日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Javascript中闭包的作用域链

發(fā)布時間:2025/5/22 java 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Javascript中闭包的作用域链 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

作用域定義了在當前上下文中能夠被訪問到的成員,在Javascript中分為全局作用域和函數(shù)作用域,通過函數(shù)嵌套可以實現(xiàn)嵌套作用域。 閉包一般發(fā)生在嵌套作用域中。閉包是JavaScript最強大的特性之一,很多高級應用都要依靠閉包實現(xiàn)。如OO的私有成員和模塊化等。然而閉包雖然強大,但一般比較占用內(nèi)存另外如果使用不當還會引起內(nèi)存泄露,對閉包有了解的jser一般都知道閉包的這些個問題,本文先闡述了閉包和作用域鏈的關系,然后分析了產(chǎn)生這些個問題的原因。下面是一段閉包的示例代碼:

?

var??name = "windows's name"; var?object = { ????name : "object's name", ????getNameFunc:function(){ ????????var?that = this; ????????return?function(){ ????????????return?that.name; ????????} ????} }; console.log(object.getNameFunc()());

??? 當javascript代碼執(zhí)行時會創(chuàng)建一個執(zhí)行上下文對象,執(zhí)行上下文對象包含一個作用域鏈,作用域鏈有一個或多個變量對象組成,作用域鏈中保存的是對變量對象的引用。變量對象定義了在當前作用域中聲明的變量和函數(shù)。在代碼的執(zhí)行過程中JAVASCRIPT引擎會按照自上而下的順序檢索作用鏈中的變量對象的成員來解析需要被訪問(讀或?qū)?#xff09;的變量或函數(shù),在檢索過程中如果在作用域鏈的某個變量對中象查找到與之匹配的標識符就會終止檢索。通過這種方式當在代碼中如果有同名的變量就可以區(qū)分出來我們要操作那個變量。
??? 當代碼載入完成后 Javascript引擎會創(chuàng)建一個全局的執(zhí)行上下文,全局執(zhí)行上下文的作用域鏈只包含一個全局變量對象。Javascript的函數(shù)對象擁有一個私有的socpe屬性,當函數(shù)被創(chuàng)建時會使用當前的作用域鏈初始化函數(shù)scope屬性。當函數(shù)被執(zhí)行時會創(chuàng)建函數(shù)的執(zhí)行上下文對象和當前作用域的變量對象,創(chuàng)建函數(shù)的執(zhí)行上下文對象時先使用函數(shù)的scope屬性給執(zhí)行上下文對象的作用域鏈賦值,再把創(chuàng)建的變量對象放入作用域鏈的頂端來初始化執(zhí)行上下文的作用域鏈。位于作用域鏈頂端的變量對象也稱為活動對象。默認情況下當函數(shù)返回時會銷毀它的活動對象和作用域鏈,這也是為什么我們函數(shù)的外部不能夠訪問到在函數(shù)內(nèi)部定義的成員。然而在發(fā)生閉包的情況下,當內(nèi)部函數(shù)被創(chuàng)建時,內(nèi)部函數(shù)的scope屬性指向包含它的外部函數(shù)的作用域鏈。這時內(nèi)部函數(shù)引用了外部函數(shù)的活動對象,當外部函數(shù)返回時,它的活動對象沒有被釋放,直到引用它的內(nèi)部函數(shù)被銷毀時才會釋放外層函數(shù)的活動對象。所以它所包含的內(nèi)部函數(shù)仍然可以訪問在外部函數(shù)中定義的成員,另外這也是閉包比較占用內(nèi)存的原因。
??? 內(nèi)存泄露問題是由于部分瀏覽器使用引用計數(shù)來作為垃圾回收機制,當在我們的代碼中發(fā)生了循環(huán)引用時,就會造成資源不能被回收從而引起內(nèi)存泄露。發(fā)生內(nèi)存泄露有時是因為在我們的代碼中發(fā)生了明顯的循環(huán)引用,有時則不那么明顯。對于前者一般通過仔細檢查代碼就能發(fā)現(xiàn)問題所在,對于后者就需要我們對閉包有足夠的了解才能發(fā)現(xiàn)。如下面代碼:

function?outerFunc(){ ????var?obj = document.getElementById("element"); ????obj.onclick=function?innerFunc(){ ????????alert("Hi! I will leak"); ????}; ????obj.bigString=new?Array(1000).join(new?Array(3000).join("XXXXX")); ????// This is used to make the leak significant };

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

總結(jié)

以上是生活随笔為你收集整理的Javascript中闭包的作用域链的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美人与性动交α欧美精品 | 亚洲女人久久久 | 国产四区视频 | 日韩欧美久久 | 久久这里只有精品23 | www激情com | 日韩精品h | 国产伦理吴梦梦伦理 | 羞辱狗奴的句子有哪些 | 欧美精品一二三四区 | 欧美日韩人妻精品一区在线 | 色人天堂 | 日本精品在线一区 | 日日爱av| 中文字幕第九页 | 婷婷色综合 | 久99久视频 | 国产美女作爱全过程免费视频 | 日本无遮羞调教打屁股网站 | 国产资源一区 | www.久久av| 日韩av综合 | 日韩美女视频在线 | 久久精品噜噜噜成人88aⅴ | 成人黄色小说在线观看 | 西西人体www大胆高清 | 国产男男chinese网站 | 亚洲国产精品成人无久久精品 | 日本一区二区在线免费观看 | 天天躁日日躁狠狠躁伊人 | 国产精品麻豆一区二区 | 亚洲精品中文字幕乱码三区91 | 91美女啪啪 | 九九视频国产 | 日韩激情床戏 | 亚洲精品一二三 | 欧美日韩国产成人精品 | 国产日韩欧美中文字幕 | 嫩草视屏| 古代黄色一级片 | 操大逼网站 | 国产精品性爱在线 | 天堂草在线观看 | 免费成人福利视频 | 在线观看国产黄 | 亚洲另类自拍 | 免费看大片a| 葵司av电影 | 麻豆成人免费视频 | 99久久国 | 日韩av网址在线观看 | 黑人一区| 草免费视频 | 性高潮久久久久 | 欧美日韩少妇 | 在线视频 中文字幕 | 黄网站免费视频 | 在线播放波多野结衣 | 国产精品久久久久一区二区三区 | 日韩影院在线 | 性欧美在线视频观看 | 国产精品影音先锋 | 亚洲综合狠狠 | 亚洲第一av在线 | 日本aa大片 | 日本啪啪动态图 | 免费久久av| 看片网站在线观看 | 人妻少妇一区 | 成人免费黄色小视频 | 国产午夜片 | 青草视频在线免费观看 | 黄黄视频在线观看 | 狠狠丁香 | 丰满少妇高潮一区二区 | 日韩在线视频看看 | 97精品视频在线观看 | 骚虎tv| 久久久久久久中文字幕 | 少妇高潮久久久久久潘金莲 | 亚洲欧美精品午睡沙发 | 久久久亚洲国产 | 爱逼av| 欧美巨乳在线 | 欧美高清视频一区二区 | 欧美性生交片4 | 91精品又粗又猛又爽 | 亚洲视频成人 | 波多野结衣一区二区三区高清 | 强行无套内谢大学生初次 | 国产人成在线观看 | 国产色a | 青青草成人网 | 久久yy| 精品日本一区二区 | 久久午夜影视 | 亚洲天堂无吗 | 亚洲国产成人一区二区 | 亚洲小说网 |