成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JS內(nèi)存泄露

canopus4u / 2992人閱讀

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

JS內(nèi)存泄露

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

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

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

綁定事件沒有移除

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

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

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

innerHTML將對象置為空

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

盡管我們將divinnerHTML賦值為空,但因?yàn)橐?b>p指向div中的p元素,這時(shí)垃圾回收器會認(rèn)為p是有用的,因?yàn)楸灰弥?,所以不會回?b>p占用的內(nèi)存,導(dǎo)致內(nèi)存泄漏。

innerHTML

閉包

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

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

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

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

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

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

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

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

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

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

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

    Chiclaim 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<