首頁技術文章正文

什么是內存泄漏?哪些情況造成內存泄露?

更新時間:2021-10-14 來源:黑馬程序員 瀏覽量:

IT培訓班

什么是內存泄漏?

內存泄漏指任何對象在不再擁有或需要它之后卻仍然存在。JavaScript中的內存泄漏大部分是由不合理的引用導致的。

哪些操作會造成內存泄漏?

下面我們介紹幾種常見的造成內存泄露的情況

1、意外聲明全局變量是最常見也最容易修復的內存泄漏問題,比如:

function fn() {
    name = '張三';
}

解釋器在解釋上面的函數時,會把name當做全局變量,即window.name = '張三'。只要window對象沒有被清理,那么name屬性和屬性值將一直存在,造成內存泄露。

解決方法:

(1)只要在變量聲明前面加上var、let或const關鍵字即可,這樣變量就會在函數執(zhí)行完畢后離開作用域。

(2)使用this關鍵字

function fn() {
    this.name = '張三';
}

(3)可以在 JavaScript 文件開頭添加 “use strict”,使用嚴格模式。這樣在嚴格模式下解析 JavaScript 可以防止意外的全局變量

(4)在使用完之后,對其賦值為null或者重新分配

2、 定時器導致的泄露

let name = '張三';
setInterval(() => {
    console.log(name);
}, 100);

上面的代碼中,只要定時器一直運行,回調函數中引用的name就會一直占用內存。

3、閉包、控制臺日志、循環(huán)(在兩個對象彼此引用且彼此保留時,就會產生一個循環(huán)),下面我們看一個JavaScript閉包導致的內訓泄露例子

let fun = function() {
    let name = '張三';
    return function() {
        return name;
    };
};

調用fun()會導致分配給name的內存被泄漏。以上代碼執(zhí)行后創(chuàng)建了一個內部閉包,只要返回的函數存在就不能清理name,因為閉包一直在引用著它。



猜你喜歡

JavaScript中l(wèi)et和var和const有什么區(qū)別?

v-show和v-if有什么區(qū)別?

什么是閉包函數?如何實現(xiàn)?

分享到:
在線咨詢 我要報名
和我們在線交談!