成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS內(nèi)存泄露

canopus4u / 2967人閱讀

摘要:內(nèi)存泄漏是指我們已經(jīng)無法再通過代碼來引用到某個對象,但垃圾回收器卻認(rèn)為這個對象還在被引用,因此在回收的時候不會釋放它。

JS內(nèi)存泄露

當(dāng)我們用JS代碼創(chuàng)建一個引用類型的時候(以下簡稱對象),JS引擎會在內(nèi)存中開辟一塊空間來存放數(shù)據(jù),并把指針引用交給那個變量。內(nèi)存是有限的,JS引擎必須保證當(dāng)開辟的對象沒用的時候,把所分配的內(nèi)存空間釋放出來,這個過程叫做垃圾回收,負(fù)責(zé)回收的叫做垃圾回收器。

內(nèi)存泄漏是指我們已經(jīng)無法再通過JS代碼來引用到某個對象,但垃圾回收器卻認(rèn)為這個對象還在被引用,因此在回收的時候不會釋放它。導(dǎo)致了分配的這塊內(nèi)存永遠也無法被釋放出來。如果這樣的情況越來越多,會導(dǎo)致內(nèi)存不夠用而系統(tǒng)崩潰。

以下幾種情況會導(dǎo)致內(nèi)存泄露

綁定事件沒有移除

當(dāng)頁面中元素被移除或替換時,若元素綁定的事件仍沒被移除,在IE中不會作出恰當(dāng)處理,此時要先手工移除事件,不然會存在內(nèi)存泄露。

下面這種情況,我們移除input元素之后,但其綁定的事件仍在,垃圾回收器會認(rèn)為這個對象還是有用的,因此不會回收這個對象,這樣就導(dǎo)致當(dāng)初為這個對象分配的內(nèi)存無法被釋放。

為了避免這種情況的發(fā)生,我們可以這樣寫

innerHTML將對象置為空

用innerHTML將對象置為空時,如果其中的元素被其他引用,也會發(fā)生內(nèi)存泄漏。

盡管我們將divinnerHTML賦值為空,但因為引用p指向div中的p元素,這時垃圾回收器會認(rèn)為p是有用的,因為被引用著,所以不會回收p占用的內(nèi)存,導(dǎo)致內(nèi)存泄漏。

innerHTML

閉包

閉包的重要作用之一就是保持狀態(tài)

正常情況下,一個函數(shù)運行結(jié)束,其內(nèi)部的變量就應(yīng)該被釋放。但下面的情況是,函數(shù)outer返回一個匿名函數(shù),這個函數(shù)引用變量obj。這樣導(dǎo)致函數(shù)outer運行結(jié)束后,它的變量obj并沒有被釋放。

function outer(){
    var obj = {name:"xiaoxiong"};
    return function(){
        console.log(obj);
    }
}
意外的全局變量

你可以通過加上"use strict"啟用嚴(yán)格模式來避免這類問題, 嚴(yán)格模式會阻止你創(chuàng)建意外的全局變量

函數(shù)運行結(jié)束,變量仍然存在,導(dǎo)致泄漏。

function work() {
    bar = "this is a hidden global variable";
}

// 上面的函數(shù)等價于
function work(arg) {
    window.bar = "this is an explicit global variable";
}

現(xiàn)在我們總結(jié)一下,導(dǎo)致內(nèi)存泄漏的原因大致可以分為兩種

函數(shù)運行結(jié)束,其內(nèi)部的變量仍存在

我們刪除元素,但元素在內(nèi)存中仍然存在

導(dǎo)致這兩種情況的根本原因就是有其他變量引用這些元素。讓垃圾回收器認(rèn)為這個元素還是有用的,因此想避免內(nèi)存泄漏,我們應(yīng)該, 要刪除一個元素,就要保證在刪除這個元素之前,這個元素不被其他其他元素引用(將引用這個元素的指針指向其他元素或置空)

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/84212.html

相關(guān)文章

  • 【拒絕拖延】常見的JavaScript內(nèi)存泄露原因及解決方案

    摘要:前言內(nèi)存泄漏指由于疏忽或錯誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存。這里就講一些常見會帶來內(nèi)存泄露的原因。解決方案和都設(shè)為。 前言 內(nèi)存泄漏指由于疏忽或錯誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存。內(nèi)存泄漏并非指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,由于設(shè)計錯誤,導(dǎo)致在釋放該段內(nèi)存之前就失去了對該段內(nèi)存的控制,從而造成了內(nèi)存的浪費。這里就講一些常見會帶來內(nèi)存泄露的原因。 0. 全局變量...

    tangr206 評論0 收藏0
  • vue單頁應(yīng)用的內(nèi)存泄露定位和修復(fù)(一)

    摘要:在前端項目端中,內(nèi)存泄露的定位往往比修復(fù)更加困難,即使瀏覽器有提供工具,但是面對成千上萬的元素和錯綜復(fù)雜的引用關(guān)系,開發(fā)則依然很難快速定位到問題代碼塊。 在前端項目(PC端)中,內(nèi)存泄露的定位往往比修復(fù)更加困難,即使google瀏覽器有提供Memory工具,但是面對成千上萬的元素和錯綜復(fù)雜的引用關(guān)系,開發(fā)則依然很難快速定位到問題代碼塊。 一、什么是內(nèi)存泄漏?系統(tǒng)進程不再用到的內(nèi)存,沒有...

    suxier 評論0 收藏0
  • vue單頁應(yīng)用的內(nèi)存泄露定位和修復(fù)(一)

    摘要:在前端項目端中,內(nèi)存泄露的定位往往比修復(fù)更加困難,即使瀏覽器有提供工具,但是面對成千上萬的元素和錯綜復(fù)雜的引用關(guān)系,開發(fā)則依然很難快速定位到問題代碼塊。 在前端項目(PC端)中,內(nèi)存泄露的定位往往比修復(fù)更加困難,即使google瀏覽器有提供Memory工具,但是面對成千上萬的元素和錯綜復(fù)雜的引用關(guān)系,開發(fā)則依然很難快速定位到問題代碼塊。 一、什么是內(nèi)存泄漏?系統(tǒng)進程不再用到的內(nèi)存,沒有...

    solocoder 評論0 收藏0
  • 詳解js閉包

    摘要:但閉包的情況不同嵌套函數(shù)的閉包執(zhí)行后,,然后還在被回收閉包會使變量始終保存在內(nèi)存中,如果不當(dāng)使用會增大內(nèi)存消耗。每個函數(shù),不論多深,都可以認(rèn)為是全局的子作用域,可以理解為閉包。 閉包(closure)是Javascript語言的一個難點,也是它的特色,很多高級應(yīng)用都要依靠閉包實現(xiàn)。 閉包的特性 閉包有三個特性: 1.函數(shù)嵌套函數(shù) 2.函數(shù)內(nèi)部可以引用外部的參數(shù)和變量 3.參數(shù)和變量不會...

    Chiclaim 評論0 收藏0

發(fā)表評論

0條評論

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