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

談?wù)凧avaScript中的垃圾回收機(jī)制

 更新時(shí)間:2020年09月17日 11:01:41   作者:guoqi  
這篇文章主要介紹了JavaScript中的垃圾回收機(jī)制,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下

   JavaScript 具有自動(dòng)垃圾收集機(jī)制,也就是說(shuō),執(zhí)行環(huán)境會(huì)負(fù)責(zé)管理代碼執(zhí)行過(guò)程中使用的內(nèi)存。

  在編寫(xiě) JavaScript 程序時(shí),開(kāi)發(fā)人員不用再關(guān)心內(nèi)存使用問(wèn)題,所需內(nèi)存的分配以及無(wú)用內(nèi)存的回收完全實(shí)現(xiàn)了自動(dòng)管理。

  這種垃圾收集機(jī)制的原理其實(shí)很簡(jiǎn)單:找出那些不再繼續(xù)使用的變量,然后釋放其占用的內(nèi)存。為此,垃圾收集器會(huì)按照固定的時(shí)間間隔(或代碼執(zhí)行中預(yù)定的收集時(shí)間), 周期性地執(zhí)行這一操作。

  具體到瀏覽器中的實(shí)現(xiàn),則通常有兩個(gè)策略,分別為標(biāo)記清除和引用計(jì)數(shù)。

一、標(biāo)記清除

  JavaScript 中最常用的垃圾收集方式是標(biāo)記清除(mark-and-sweep)。當(dāng)變量進(jìn)入環(huán)境(例如,在函數(shù)中聲明一個(gè)變量)時(shí),就將這個(gè)變量標(biāo)記為“進(jìn)入環(huán)境”。而當(dāng)變量離開(kāi)環(huán)境時(shí),則將其標(biāo)記為“離開(kāi)環(huán)境”。

  垃圾收集器在運(yùn)行的時(shí)候會(huì)給存儲(chǔ)在內(nèi)存中的所有變量都加上標(biāo)記??梢允褂萌魏螛?biāo)記方式,比如,可以通過(guò)翻轉(zhuǎn)某個(gè)特殊的位來(lái)記錄一個(gè)變量何時(shí)進(jìn)入環(huán)境, 或者使用一個(gè)“進(jìn)入環(huán)境的”變量列表及一個(gè)“離開(kāi)環(huán)境的”變量列表來(lái)跟蹤哪個(gè)變量發(fā)生了變化。

  然后,它會(huì)去掉環(huán)境中的變量以及被環(huán)境中的變量引用的變量的標(biāo)記。而在此之后再被加上標(biāo)記的變量將被視為準(zhǔn)備刪除的變量,原因是環(huán)境中的變量已經(jīng)無(wú)法訪(fǎng)問(wèn)到這些變量了。

  最后,垃圾收集器完成內(nèi)存清除工作,銷(xiāo)毀那些帶標(biāo)記的值并回收它們所占用的內(nèi)存空間。

二、引用計(jì)數(shù)

  另一種不太常見(jiàn)的垃圾收集策略叫做引用計(jì)數(shù)(reference counting)。引用計(jì)數(shù)的含義是跟蹤記錄每個(gè)值被引用的次數(shù)。

  當(dāng)聲明了一個(gè)變量并將一個(gè)引用類(lèi)型值賦給該變量時(shí),則這個(gè)值的引用次數(shù)就是 1。 如果同一個(gè)值又被賦給另一個(gè)變量,則該值的引用次數(shù)加 1。相反,如果包含對(duì)這個(gè)值引用的變量又取得了另外一個(gè)值,則這個(gè)值的引用次數(shù)減 1。

  當(dāng)這個(gè)值的引用次數(shù)變成 0 時(shí),則說(shuō)明沒(méi)有辦法再訪(fǎng)問(wèn)這個(gè)值了,因而就可以將其占用的內(nèi)存空間回收回來(lái)。

  這樣,當(dāng)垃圾收集器下次再運(yùn)行時(shí),它就會(huì)釋放那些引用次數(shù)為零的值所占用的內(nèi)存。

  存在的問(wèn)題:只要在 IE 中涉及 COM(Component Object Model,組件對(duì)象模型)對(duì)象,就會(huì)存在循環(huán)引用的問(wèn)題。如下面代碼所示:

var element = document.getElementById("some_element");
var myObject = new Object();
myObject.element = element;
element.someObject = myObject;

  這個(gè)例子在一個(gè) DOM 元素(element)與一個(gè)原生 JavaScript 對(duì)象(myObject)之間創(chuàng)建了循環(huán)引用。

  其中,變量 myObject 有一個(gè)名為 element 的屬性指向 element 對(duì)象。

  而變量 element 也有 一個(gè)屬性名叫 someObject 回指 myObject。

  由于存在這個(gè)循環(huán)引用,即使將例子中的 DOM 從頁(yè)面中移除,它也永遠(yuǎn)不會(huì)被回收。

  解決方法:最好是在不使用它們的時(shí)候手工斷開(kāi)原生 JavaScript 對(duì)象與 DOM 元素之間的連接。

myObject.element = null;
element.someObject = null;

  將變量設(shè)置為 null 意味著切斷變量與它此前引用的值之間的連接。當(dāng)垃圾收集器下次運(yùn)行時(shí),就會(huì)刪除這些值并回收它們占用的內(nèi)存。

三、管理內(nèi)存

  確保占用最少的內(nèi)存可以讓頁(yè)面獲得更好的性能。而優(yōu)化內(nèi)存占用的最佳方式,就是為執(zhí)行中的代碼只保存必要的數(shù)據(jù)。

  一旦數(shù)據(jù)不再有用,最好通過(guò)將其值設(shè)置為 null 來(lái)釋放其引用——這個(gè)做法叫做解除引用(dereferencing)。

  這一做法適用于大多數(shù)全局變量和全局對(duì)象的屬性。局部變量會(huì)在它們離開(kāi)執(zhí)行環(huán)境時(shí)自動(dòng)被解除引用,如下面這個(gè)例子所示:

function createPerson(name){
 var localPerson = new Object();
 localPerson.name = name;
 }
var globalPerson = createPerson("Nicholas");
globalPerson = null; // 手工解除globalPerson 的引用

   變量 globalPerson 取得了 createPerson()函數(shù)返回的值。在 createPerson() 函數(shù)內(nèi)部,我們創(chuàng)建了一個(gè)對(duì)象并將其賦給局部變量localPerson,然后又為該對(duì)象添加了一個(gè)名為 name 的屬性。最后,當(dāng)調(diào)用這個(gè)函數(shù)時(shí),localPerson 以函數(shù)值的形式返回并賦給全局變量 globalPerson。

  由于 localPerson 在 createPerson()函數(shù)執(zhí)行完畢后就離開(kāi)了其執(zhí)行環(huán)境,因此無(wú)需我們顯式地去為它解除引用。

  但是對(duì)于全局變量 globalPerson 而言,則需要我們?cè)诓皇褂盟臅r(shí)候手工為它解除引用,這也正是上面例子中最后一行代碼的目的。

以上就是談?wù)凧avaScript中的垃圾回收機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于JavaScript 垃圾回收的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JS實(shí)現(xiàn)簡(jiǎn)易的圖片拖拽排序?qū)嵗a

    JS實(shí)現(xiàn)簡(jiǎn)易的圖片拖拽排序?qū)嵗a

    這篇文章主要介紹了JS實(shí)現(xiàn)簡(jiǎn)易的圖片拖拽排序?qū)嵗a,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • js移動(dòng)焦點(diǎn)到最后位置的簡(jiǎn)單方法

    js移動(dòng)焦點(diǎn)到最后位置的簡(jiǎn)單方法

    下面小編就為大家?guī)?lái)一篇js移動(dòng)焦點(diǎn)到最后位置的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-11-11
  • 修改ligerui 默認(rèn)確認(rèn)按鈕的方法

    修改ligerui 默認(rèn)確認(rèn)按鈕的方法

    下面小編就為大家?guī)?lái)一篇修改ligerui 默認(rèn)確認(rèn)按鈕的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • js控制文本框只能輸入中文、英文、數(shù)字與指定特殊符號(hào)的實(shí)現(xiàn)代碼

    js控制文本框只能輸入中文、英文、數(shù)字與指定特殊符號(hào)的實(shí)現(xiàn)代碼

    下面小編就為大家?guī)?lái)一篇js控制文本框只能輸入中文、英文、數(shù)字與指定特殊符號(hào)的實(shí)現(xiàn)代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • JavaScript設(shè)計(jì)模式之觀察者模式與發(fā)布訂閱模式詳解

    JavaScript設(shè)計(jì)模式之觀察者模式與發(fā)布訂閱模式詳解

    這篇文章主要介紹了JavaScript設(shè)計(jì)模式之觀察者模式與發(fā)布訂閱模式,結(jié)合實(shí)例形式詳細(xì)分析了JavaScript觀察者模式與發(fā)布訂閱模式相關(guān)概念、原理
    2020-05-05
  • TypeScript學(xué)習(xí)筆記之類(lèi)型窄化篇

    TypeScript學(xué)習(xí)筆記之類(lèi)型窄化篇

    目前用TypeScript的人越來(lái)越多,尤其是一些大廠,大的項(xiàng)目,github上面很多開(kāi)源項(xiàng)目也都是ts語(yǔ)法編譯的,這篇文章主要給大家介紹了關(guān)于TypeScript學(xué)習(xí)筆記之類(lèi)型窄化的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • 微信小程序跳轉(zhuǎn)到其他網(wǎng)頁(yè)(外部鏈接)的實(shí)現(xiàn)方法

    微信小程序跳轉(zhuǎn)到其他網(wǎng)頁(yè)(外部鏈接)的實(shí)現(xiàn)方法

    這篇文章主要介紹了微信小程序跳轉(zhuǎn)到其他網(wǎng)頁(yè)(外部鏈接)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • JSON格式的鍵盤(pán)編碼對(duì)照表

    JSON格式的鍵盤(pán)編碼對(duì)照表

    這篇文章主要介紹了JSON格式的鍵盤(pán)編碼對(duì)照表,本文給出英文鍵名、對(duì)應(yīng)數(shù)值和中文注釋,需要的朋友可以參考下
    2015-01-01
  • JS實(shí)現(xiàn)帶提示的星級(jí)評(píng)分效果完整實(shí)例

    JS實(shí)現(xiàn)帶提示的星級(jí)評(píng)分效果完整實(shí)例

    這篇文章主要介紹了JS實(shí)現(xiàn)帶提示的星級(jí)評(píng)分效果,以完整實(shí)例形式較為詳細(xì)的分析了JavaScript響應(yīng)鼠標(biāo)事件動(dòng)態(tài)變換頁(yè)面元素樣式的相關(guān)技巧,非常簡(jiǎn)單實(shí)用的代碼,需要的朋友可以參考下
    2015-10-10
  • 35個(gè)JS中實(shí)用工具函數(shù)的代碼分享

    35個(gè)JS中實(shí)用工具函數(shù)的代碼分享

    身為后臺(tái)開(kāi)發(fā)的各位鐵鐵,實(shí)際開(kāi)發(fā)不管是公司要求或是自身發(fā)展,學(xué)前端已經(jīng)是我們內(nèi)卷路上必定碰到的,那今天小編就給大家總結(jié)下那些我們工作中可能遇到的一些實(shí)用Js函數(shù)
    2022-06-06

最新評(píng)論

虞城县| 宜川县| 嘉荫县| 永平县| 宁河县| 霸州市| 墨竹工卡县| 翁牛特旗| 城市| 浑源县| 新建县| 伊通| 福泉市| 卓资县| 南昌县| 修文县| 铜山县| 阳泉市| 丰都县| 张家川| 昆山市| 怀化市| 建水县| 龙井市| 修文县| 武穴市| 西丰县| 凤城市| 中山市| 巴彦淖尔市| 来安县| 胶南市| 青川县| 新昌县| 柳州市| 大同市| 石门县| 齐河县| 大丰市| 堆龙德庆县| 新兴县|