目錄
1. 全域變數
2. 閉包
3. 被遺忘的延時器/計時器
dom清空或刪除時,事件未清除)" >4、沒有清理的DOM元素參考(dom清空或刪除時,事件未清除
首頁 web前端 前端問答 javascript記憶體洩漏的原因有哪些

javascript記憶體洩漏的原因有哪些

Nov 19, 2021 pm 04:37 PM
javascript 內存洩漏

javascript記憶體洩漏的原因:1、全域變數使用不當;2、閉包使用不當;3、延時器或定時器沒有被清除;4、沒有清理的DOM元素引用(dom清空或刪除時,事件未清除)。

javascript記憶體洩漏的原因有哪些

本教學操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。

記憶體外洩是指一塊被分配的記憶體既不能使用,又不能回收,直到瀏覽器進程結束。即指因疏忽或錯誤造成程序未能釋放已不再使用的記憶體。 記憶體洩漏並非指內存在物理上的消失,而是應用程式分配某段記憶體後,由於設計錯誤,導致在釋放該段記憶體之前就失去了對該段記憶體的控制,從而造成了記憶體的浪費。這裡就講一些常見會帶來記憶體外洩的原因。

1. 全域變數

JavaScript可以處理沒有宣告的變數:一個未宣告的變數的參考在全域物件中建立了一個新變數。在瀏覽器的環境中,全域物件是window。

function foo(){
  name = '前端曰';
}
// 其实是把name变量挂载在window对象上
function foo(){
  window.name = '前端曰';
}

// 又或者
function foo(){
  this.name = '前端曰';
}
foo() // 其实这里的this就是指向的window对象
登入後複製

這樣無意中一個意外的全域變數就被創建了,為了阻止這種錯誤發生,在你的Javascript檔案最前面加上 ‘use strict;’ 。這開啟了解析JavaScript的阻止意外全域的更嚴格的模式。或是自己注意好變數的定義!

2. 閉包

閉包:匿名函數可以存取父級作用域的變數。

var names = (function(){  
    var name = 'js-say';
    return function(){
        console.log(name);
    }
})()
登入後複製

閉包會造成物件引用的生命週期脫離目前函數的上下文,如果閉包使用不當,可以導致環形引用(circular reference),類似於死鎖,只能避免,無法發生之後解決,即使有垃圾回收還是會記憶體洩漏。

3. 被遺忘的延時器/計時器

在我們的日常需求中,可能會經常試用到 setInterval/setTimeout ,但使用完後通常會忘記清理。

var someResource = getData(); 
setInterval(function() { 
    var node = document.getElementById('Node'); 
    if(node) { 
        // 处理 node 和 someResource 
        node.innerHTML = JSON.stringify(someResource)); 
    } 
}, 1000);
登入後複製

setInterval/setTimeout 中的this 指向的是window對象,所以內部定義的變數也掛載到了全域;if 內引用了someResource 變數,如果沒有清除setInterval/setTimeout 的話someResource 也無法釋放;同理其實setTimeout 也是一樣。所以我們用完需要記得去 clearInterval/clearTimeout。

4、沒有清理的DOM元素參考(dom清空或刪除時,事件未清除

var elements = {
    button: document.getElementById('button'),
    image: document.getElementById('image'),
    text: document.getElementById('text')
};
function doStuff() {
    image.src = 'http://some.url/image';
    button.click();
    console.log(text.innerHTML);
}
function removeButton() {
    document.body.removeChild(document.getElementById('button'));
    // 此时,仍旧存在一个全局的 #button 的引用
    // elements 字典。button 元素仍旧在内存中,不能被 GC 回收。
}
登入後複製

【建議學習:javascript進階教學

以上是javascript記憶體洩漏的原因有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Golang 技術效能優化中如何避免記憶體洩漏? Golang 技術效能優化中如何避免記憶體洩漏? Jun 04, 2024 pm 12:27 PM

Golang 技術效能優化中如何避免記憶體洩漏?

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

簡易JavaScript教學:取得HTTP狀態碼的方法

解決閉包導致的記憶體洩漏問題 解決閉包導致的記憶體洩漏問題 Feb 18, 2024 pm 03:20 PM

解決閉包導致的記憶體洩漏問題

Go 記憶體洩漏追蹤:Go pprof 實作指南 Go 記憶體洩漏追蹤:Go pprof 實作指南 Apr 08, 2024 am 10:57 AM

Go 記憶體洩漏追蹤:Go pprof 實作指南

如何使用 Valgrind 或 AddressSanitizer 來尋找 C++ 中的記憶體洩漏? 如何使用 Valgrind 或 AddressSanitizer 來尋找 C++ 中的記憶體洩漏? Jun 02, 2024 pm 09:23 PM

如何使用 Valgrind 或 AddressSanitizer 來尋找 C++ 中的記憶體洩漏?

閉包中如何有效避免記憶體洩漏? 閉包中如何有效避免記憶體洩漏? Jan 13, 2024 pm 12:46 PM

閉包中如何有效避免記憶體洩漏?

C++ 中記憶體洩漏的調試技術 C++ 中記憶體洩漏的調試技術 Jun 05, 2024 pm 10:19 PM

C++ 中記憶體洩漏的調試技術

如何使用Valgrind檢測記憶體洩漏? 如何使用Valgrind檢測記憶體洩漏? Jun 05, 2024 am 11:53 AM

如何使用Valgrind檢測記憶體洩漏?

See all articles