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

資訊專欄INFORMATION COLUMN

JS內存泄露

canopus4u / 2946人閱讀

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

JS內存泄露

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

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

以下幾種情況會導致內存泄露

綁定事件沒有移除

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

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

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

innerHTML將對象置為空

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

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

innerHTML

閉包

閉包的重要作用之一就是保持狀態

正常情況下,一個函數運行結束,其內部的變量就應該被釋放。但下面的情況是,函數outer返回一個匿名函數,這個函數引用變量obj。這樣導致函數outer運行結束后,它的變量obj并沒有被釋放。

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

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

函數運行結束,變量仍然存在,導致泄漏。

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

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

現在我們總結一下,導致內存泄漏的原因大致可以分為兩種

函數運行結束,其內部的變量仍存在

我們刪除元素,但元素在內存中仍然存在

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/84212.html

相關文章

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

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

    tangr206 評論0 收藏0
  • vue單頁應用的內存泄露定位和修復(一)

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

    suxier 評論0 收藏0
  • vue單頁應用的內存泄露定位和修復(一)

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

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

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

    Chiclaim 評論0 收藏0

發表評論

0條評論

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