最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript 內(nèi)存回收機(jī)制理解

 更新時(shí)間:2011年01月17日 22:35:02   作者:  
javascript語(yǔ)言是一門優(yōu)秀的腳本語(yǔ)言.其中包含腳本語(yǔ)言的靈活性外還擁有許多高級(jí)語(yǔ)言的特性.
1.嘮叨
javascript語(yǔ)言是一門優(yōu)秀的腳本語(yǔ)言.其中包含腳本語(yǔ)言的靈活性外還擁有許多高級(jí)語(yǔ)言的特性.例如充許構(gòu)建和實(shí)例化一個(gè)對(duì)象,垃圾回收機(jī)制(GC:Garbage Collecation).通常我們使用new創(chuàng)建對(duì)象,GC負(fù)責(zé)回收對(duì)象占用內(nèi)存區(qū)域.因此了解GC,可以加深對(duì)javascript垃圾回收機(jī)制的理解。
2.用局部變量和全局變量解釋GC
GC在回收內(nèi)存時(shí),首先會(huì)判斷該對(duì)象是否被其它對(duì)象引用.在確定沒(méi)有其它對(duì)象引用便釋放該對(duì)象內(nèi)存區(qū)域.因此如何確定對(duì)象不再被引用是GC的關(guān)鍵所在.
復(fù)制代碼 代碼如下:

<script>
function aa(){
this.rr = "彈窗";
}
function bb(){
this.rr = "彈窗";
}
var b1;
function cc(){
var a1 = new aa();
b1 = new bb();
return b1;
}
cc();
alert(b1.rr)
</script>

如上代碼中,執(zhí)行完cc()后a1被回收了,此后我們可以通過(guò)b1.rr彈出文字窗口.在一些基礎(chǔ)書籍中解釋為:a1為局部變量,b1是全局變量.局部變量執(zhí)行完后會(huì)被GC回收.但不全是這樣,如下代碼:
復(fù)制代碼 代碼如下:

<script>
function aa(){
this.rr = "彈窗";
}
function bb(){
this.rr = "彈窗";
}
function cc(){
var a1 = new aa();
var b1 = new bb();
return b1;
}
var b1 = cc();
alert(b1.rr);
</script>

此時(shí)cc函數(shù)中的 a1,b1都是局部變量,但仍然會(huì)彈出文字窗口.說(shuō)明b1并沒(méi)有被GC回收.因此javascript中局部變量不是所有時(shí)候都被GC回收的.
3.抽象理解GC
GC回收機(jī)制還需要近一步了解。在此時(shí)引入幾個(gè)概念:雙向鏈表,作用域鏈,活動(dòng)對(duì)象(為了方便理解,簡(jiǎn)化了原文的概念[http://softbbs.pconline.com.cn/9497825.html]) , 其中雙向鏈表描述復(fù)雜對(duì)象的上下層級(jí)關(guān)系. 作用域鏈與活動(dòng)對(duì)象分別是雙向鏈表中的某個(gè)節(jié)點(diǎn).以函數(shù)cc為例變量層級(jí)關(guān)系為:
window<=>cc<=>a1<=>rr
<=>b1<=>rr
(原文有詳細(xì)解釋)在執(zhí)行cc()方法時(shí),內(nèi)存中變量的引用關(guān)系如上圖,文字解釋如下:
window的活動(dòng)對(duì)象包括cc,假設(shè)window是頂級(jí)對(duì)象(因?yàn)檫\(yùn)行中不會(huì)被回收)
cc的活動(dòng)對(duì)象包括a1和b1,其作用域鏈?zhǔn)莣indow
a1的活動(dòng)對(duì)象包括rr,其作用域鏈?zhǔn)莄c
b1的活動(dòng)對(duì)象包括rr,其作用域鏈?zhǔn)莄c
執(zhí)行cc()時(shí),cc的執(zhí)行環(huán)境會(huì)創(chuàng)建一個(gè)活動(dòng)對(duì)象和一個(gè)作用域鏈.其局部變量a1,b1都會(huì)掛在cc的活動(dòng)對(duì)象中.當(dāng)cc()執(zhí)行完畢后,執(zhí)行環(huán)境會(huì)嘗試回收活動(dòng)對(duì)象占用的內(nèi)存.但因局部變量b1 通過(guò)return b1,為其增加了一條作用域鏈:window<=>b1<=>rr,所以GC停止對(duì)b1回收.
因此如果想將一個(gè)局部變量/函數(shù)提升為全局的,為其增加一條作用域鏈就OK了。
同時(shí)控制好對(duì)象的作用域鏈也變得重要了.因作用域鏈會(huì)意外導(dǎo)致GC無(wú)法回收目標(biāo)對(duì)象.例如:
復(fù)制代碼 代碼如下:

<SCRIPT LANGUAGE="JavaScript">
<!--
//貓
function cat(name){
var zhuren ;
this.name = name;
//設(shè)置主人
this.addZhuRen = function(zr){
zhuren = zr;
}
this.getZhuRen = function(){
return zhuren;
}
}
//主人
function zhuren(name){
this.name = name;
}
//創(chuàng)建主人:
var zr = new zhuren("zhangsan");
//創(chuàng)建貓
var cat1 = new cat("asan");
//設(shè)置該貓的主人
cat1.addZhuRen(zr);
//釋放主人
zr = null ;
//此處還存在對(duì)主人對(duì)象的引用
alert(cat1.getZhuRen().name)
//-->
</SCRIPT>

相關(guān)文章

  • JavaScript學(xué)習(xí)筆記之檢測(cè)客戶端類型是(引擎、瀏覽器、平臺(tái)、操作系統(tǒng)、移動(dòng)設(shè)備)

    JavaScript學(xué)習(xí)筆記之檢測(cè)客戶端類型是(引擎、瀏覽器、平臺(tái)、操作系統(tǒng)、移動(dòng)設(shè)備)

    這篇文章主要介紹了JavaScript學(xué)習(xí)筆記之檢測(cè)客戶端類型是(引擎、瀏覽器、平臺(tái)、操作系統(tǒng)、移動(dòng)設(shè)備)的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • 原生JS實(shí)現(xiàn)分頁(yè)點(diǎn)擊控件

    原生JS實(shí)現(xiàn)分頁(yè)點(diǎn)擊控件

    這篇文章主要為大家詳細(xì)介紹了原生JS實(shí)現(xiàn)分頁(yè)點(diǎn)擊控件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 淺析JavaScript中瀏覽器的兼容問(wèn)題

    淺析JavaScript中瀏覽器的兼容問(wèn)題

    下面小編就為大家?guī)?lái)一篇淺析JavaScript中瀏覽器的兼容問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考
    2016-04-04
  • js控制的回到頁(yè)面頂端goTop的代碼實(shí)現(xiàn)

    js控制的回到頁(yè)面頂端goTop的代碼實(shí)現(xiàn)

    在瀏覽網(wǎng)頁(yè)的時(shí)候應(yīng)該會(huì)經(jīng)常見到右下角有個(gè)【回到頂端】的懸浮東東,本文也要使用js實(shí)現(xiàn)一下,感興趣的朋友可以參考下哈,希望可以幫助到你
    2013-03-03
  • 歸納下js面向?qū)ο蟮膸追N常見寫法總結(jié)

    歸納下js面向?qū)ο蟮膸追N常見寫法總結(jié)

    下面小編就為大家?guī)?lái)一篇?dú)w納下js面向?qū)ο蟮膸追N常見寫法總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • javascript實(shí)現(xiàn)右側(cè)彈出“分享到”窗口效果

    javascript實(shí)現(xiàn)右側(cè)彈出“分享到”窗口效果

    這篇文章主要為大家介紹了javascript實(shí)現(xiàn)右側(cè)彈出“分享到”窗口效果,以一個(gè)完整的js右側(cè)彈出“分享到”窗口的實(shí)例代碼進(jìn)行分析,感興趣的小伙伴們可以參考一下
    2016-02-02
  • 淺談Javascript事件模擬

    淺談Javascript事件模擬

    事件是用來(lái)描述網(wǎng)頁(yè)中某一特定有趣時(shí)刻的,眾所周知事件通常是在由用戶和瀏覽器進(jìn)行交互時(shí)觸發(fā),其實(shí)不然,通過(guò)Javascript可以在任何時(shí)間觸發(fā)特定的事件,并且這些事件與瀏覽器創(chuàng)建的事件是相同的
    2012-06-06
  • jQuery AJAX回調(diào)函數(shù)this指向問(wèn)題

    jQuery AJAX回調(diào)函數(shù)this指向問(wèn)題

    了解JavaScript的人都知道JavaScript的this不總是指向當(dāng)前對(duì)象,函數(shù)或類中的this指向與調(diào)用這個(gè)函數(shù)的對(duì)象以及上下文環(huán)境是息息相關(guān)的。
    2010-02-02
  • JS實(shí)現(xiàn)OCX控件的事件響應(yīng)示例

    JS實(shí)現(xiàn)OCX控件的事件響應(yīng)示例

    JS支持OCX控件的事件(event),當(dāng)OCX控件定義的事件發(fā)生時(shí),JS可以捕獲該事件并對(duì)事件進(jìn)行相應(yīng)的處理
    2014-09-09
  • JavaScript包裝對(duì)象使用詳解

    JavaScript包裝對(duì)象使用詳解

    javascript代碼運(yùn)行的過(guò)程中基本類型會(huì)找到對(duì)應(yīng)的包裝對(duì)象,然后包裝對(duì)象把所有的屬性和方法給了基本類型,然后包裝對(duì)象被系統(tǒng)進(jìn)行銷毀,所以理解了包裝對(duì)象可以很好的理解之前寫的代碼為什么可以這樣做了。
    2015-07-07

最新評(píng)論

原阳县| 金坛市| 绍兴市| 久治县| 读书| 秦安县| 通化市| 万载县| 茶陵县| 临城县| 福安市| 枞阳县| 广德县| 高安市| 宜兰县| 武汉市| 仙游县| 都安| 阿拉善左旗| 花莲市| 务川| 仁怀市| 普兰县| 景德镇市| 余姚市| 辽阳市| 理塘县| 河池市| 上高县| 盐池县| 新邵县| 杂多县| 仪征市| 错那县| 武川县| 三台县| 迁西县| 九江市| 稻城县| 崇信县| 昭苏县|