国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

由閉包引出的垃圾回收

MoAir / 989人閱讀

摘要:就會造成內(nèi)存泄漏這里導(dǎo)致一直存在內(nèi)存中應(yīng)該將解除引用來避免內(nèi)存泄漏這里導(dǎo)致一致存在內(nèi)存中的垃圾回收機制看完內(nèi)存泄漏需要了解下的垃圾回收機制,首先具有自動垃圾回收機制,會找出不再使用的變量,然后釋放其占用的內(nèi)存。

由閉包引出的垃圾回收 閉包的特性

函數(shù)嵌套函數(shù)

函數(shù)內(nèi)部可以引用外部的參數(shù)和變量

參數(shù)和變量不會被垃圾回收機制回收

閉包的定義

閉包 是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù),創(chuàng)建閉包最常見的方式就是在一個函數(shù)內(nèi)部創(chuàng)建l另一個函數(shù),通過另一個函數(shù)訪問這個函數(shù)的局部變量

主要應(yīng)用閉包的場合:設(shè)計私有的方法和變量

閉包的優(yōu)點

希望一個變量長期駐扎在內(nèi)存中

避免全局變量的污染

私有成員的存在

閉包的缺點

閉包會使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大,所以不能濫用閉包,否則會造成網(wǎng)頁的性能問題。

在IE中可能導(dǎo)致內(nèi)存泄露。解決方法是,在退出函數(shù)之前,將不使用的局部變量全部刪除。

在 IE8 以下的版本里,DOM 對象經(jīng)常會跟 JavaScript 之間產(chǎn)生循環(huán)引用。就會造成內(nèi)存泄漏:

function closure() {
    var element = document.getElementById("someElement");
    element.onclick = function(){
        alert(element.id) // 這里導(dǎo)致element一直存在內(nèi)存中
    }
}

應(yīng)該將element解除引用來避免內(nèi)存泄漏

function closure() {
    var element = document.getElementById("someElement");
    var test = element.id
    element.onclick = function(){
        alert(test) // 這里導(dǎo)致element一致存在內(nèi)存中
    }
    element = null
}
JavaScript 的垃圾回收機制

看完內(nèi)存泄漏需要了解下JavaScript的垃圾回收機制,首先JavaScript具有自動垃圾回收機制,會找出不再使用的變量,然后釋放其占用的內(nèi)存。常用的方法有兩種,即標(biāo)記清除引用計數(shù)

引用計數(shù)

語言引擎有一張引用表,保存了內(nèi)存里面所有的資源(各種值)的引用次數(shù)。如果一個值的引用次數(shù)為0,就表示這個值不再用到了,因此就可以將這塊內(nèi)存釋放。但是引用計數(shù)有個最大的問題: 循環(huán)引用。

function func() {
    let obj1 = {};
    let obj2 = {};

    obj1.a = obj2; // obj1 引用 obj2
    obj2.a = obj1; // obj2 引用 obj1
}

當(dāng)函數(shù) func 執(zhí)行結(jié)束后,返回值為 undefined,所以整個函數(shù)以及內(nèi)部的變量都應(yīng)該被回收,但根據(jù)引用計數(shù)方法,obj1 和 obj2 的引用次數(shù)都不為 0,所以他們不會被回收。

要解決循環(huán)引用的問題,最好是在不使用它們的時候手工將它們設(shè)為空。上面的例子可以這么做:

obj1 = null;
obj2 = null;
標(biāo)記清除

JavaScript 中有個全局對象,瀏覽器中是 window。定期的,垃圾回收期將從這個全局對象開始,找所有從這個全局對象開始引用的對象,再找這些對象引用的對象...對這些活著的對象進(jìn)行標(biāo)記,這是標(biāo)記階段。清除階段就是清除那些沒有被標(biāo)記的對象。

總結(jié)

閉包只會在IE8以下的版本中才有可能造成內(nèi)存泄漏問題,在最新版本的瀏覽器中,可以通過標(biāo)記清除的方式處理掉內(nèi)存泄漏,不過閉包的變量會常駐內(nèi)存,會造成一定的性能問題。

原文地址:https://github.com/hu970804/L...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/97023.html

相關(guān)文章

  • 淺談js內(nèi)存與閉包

    摘要:將他們放在堆中是為了不影響棧的效率。接著是臨時空間函數(shù)執(zhí)行的時候,會臨時開辟一塊內(nèi)存空間,這塊內(nèi)存空間長得和外面這個一樣,也有自己的棧堆,當(dāng)函數(shù)運行完就銷毀。中的內(nèi)存第一個部分還是和上面的一樣,有棧堆運行時環(huán)境,另外還有一個緩沖區(qū)存放。 0.前言 主要結(jié)合了內(nèi)存的概念講了js的一些的很簡單、但是又不小心就犯錯的地方。結(jié)論:js執(zhí)行順序,先定義,后執(zhí)行,從上到下,就近原則。閉包可以讓外部...

    dailybird 評論0 收藏0
  • 夯實基礎(chǔ)-作用域與閉包

    摘要:作用域分類作用域共有兩種主要的工作模型。換句話說,作用域鏈?zhǔn)腔谡{(diào)用棧的,而不是代碼中的作用域嵌套。詞法作用域詞法作用域中,又可分為全局作用域,函數(shù)作用域和塊級作用域。 一篇鞏固基礎(chǔ)的文章,也可能是一系列的文章,梳理知識的遺漏點,同時也探究很多理所當(dāng)然的事情背后的原理。 為什么探究基礎(chǔ)?因為你不去面試你就不知道基礎(chǔ)有多重要,或者是說當(dāng)你的工作經(jīng)歷沒有亮點的時候,基礎(chǔ)就是檢驗?zāi)愫脡牡囊豁?..

    daydream 評論0 收藏0
  • JavaScript 工作原理之三-內(nèi)存管理及如何處理 4 類常見內(nèi)存泄漏問題(譯)

    摘要:這是因為我們訪問了數(shù)組中不存在的數(shù)組元素它超過了最后一個實際分配到內(nèi)存的數(shù)組元素字節(jié),并且有可能會讀取或者覆寫的位。包含個元素的新數(shù)組由和數(shù)組元素所組成中的內(nèi)存使用中使用分配的內(nèi)存主要指的是內(nèi)存讀寫。 原文請查閱這里,本文有進(jìn)行刪減,文后增了些經(jīng)驗總結(jié)。 本系列持續(xù)更新中,Github 地址請查閱這里。 這是 JavaScript 工作原理的第三章。 我們將會討論日常使用中另一個被開發(fā)...

    weknow619 評論0 收藏0
  • 前端面試之閉包

    摘要:在函數(shù)內(nèi)部的變量稱之為局部變量,它可以在函數(shù)內(nèi)部讀取,在函數(shù)外部無法正常讀取,如果想要讀取函數(shù)內(nèi)部的變量則需要用到閉包。 前端面試之閉包 閉包屬于屬于JavaScript的難點,但是在很多高級應(yīng)用都需要用到,也是前端面試中經(jīng)常會考到的點。 作用域 談到閉包首先必須了解作用域,ES5中,JavaScript的作用域只有兩種,一種是全局作用域,變量在整個程序中一直存在,所有地方都可以讀取;...

    jackzou 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<