摘要:內(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)存泄漏。
盡管我們將div的innerHTML賦值為空,但因為引用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
摘要:前言內(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. 全局變量...
摘要:在前端項目端中,內(nèi)存泄露的定位往往比修復(fù)更加困難,即使瀏覽器有提供工具,但是面對成千上萬的元素和錯綜復(fù)雜的引用關(guān)系,開發(fā)則依然很難快速定位到問題代碼塊。 在前端項目(PC端)中,內(nèi)存泄露的定位往往比修復(fù)更加困難,即使google瀏覽器有提供Memory工具,但是面對成千上萬的元素和錯綜復(fù)雜的引用關(guān)系,開發(fā)則依然很難快速定位到問題代碼塊。 一、什么是內(nèi)存泄漏?系統(tǒng)進程不再用到的內(nèi)存,沒有...
摘要:在前端項目端中,內(nèi)存泄露的定位往往比修復(fù)更加困難,即使瀏覽器有提供工具,但是面對成千上萬的元素和錯綜復(fù)雜的引用關(guān)系,開發(fā)則依然很難快速定位到問題代碼塊。 在前端項目(PC端)中,內(nèi)存泄露的定位往往比修復(fù)更加困難,即使google瀏覽器有提供Memory工具,但是面對成千上萬的元素和錯綜復(fù)雜的引用關(guān)系,開發(fā)則依然很難快速定位到問題代碼塊。 一、什么是內(nèi)存泄漏?系統(tǒng)進程不再用到的內(nèi)存,沒有...
摘要:但閉包的情況不同嵌套函數(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ù)和變量不會...
閱讀 2638·2021-11-02 14:39
閱讀 4369·2021-10-11 10:58
閱讀 1505·2021-09-06 15:12
閱讀 1890·2021-09-01 10:49
閱讀 1365·2019-08-29 18:31
閱讀 1904·2019-08-29 16:10
閱讀 3377·2019-08-28 18:21
閱讀 906·2019-08-26 10:42