全國(guó)咨詢(xún)/投訴熱線:400-618-4000

首頁(yè)技術(shù)文章正文

什么是內(nèi)存泄漏?哪些情況造成內(nèi)存泄露?

更新時(shí)間:2021-10-14 來(lái)源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

什么是內(nèi)存泄漏?

內(nèi)存泄漏指任何對(duì)象在不再擁有或需要它之后卻仍然存在。JavaScript中的內(nèi)存泄漏大部分是由不合理的引用導(dǎo)致的。

哪些操作會(huì)造成內(nèi)存泄漏?

下面我們介紹幾種常見(jiàn)的造成內(nèi)存泄露的情況

1、意外聲明全局變量是最常見(jiàn)也最容易修復(fù)的內(nèi)存泄漏問(wèn)題,比如:

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

解釋器在解釋上面的函數(shù)時(shí),會(huì)把name當(dāng)做全局變量,即window.name = '張三'。只要window對(duì)象沒(méi)有被清理,那么name屬性和屬性值將一直存在,造成內(nèi)存泄露。

解決方法:

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

(2)使用this關(guān)鍵字

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

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

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

2、 定時(shí)器導(dǎo)致的泄露

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

上面的代碼中,只要定時(shí)器一直運(yùn)行,回調(diào)函數(shù)中引用的name就會(huì)一直占用內(nèi)存。

3、閉包、控制臺(tái)日志、循環(huán)(在兩個(gè)對(duì)象彼此引用且彼此保留時(shí),就會(huì)產(chǎn)生一個(gè)循環(huán)),下面我們看一個(gè)JavaScript閉包導(dǎo)致的內(nèi)訓(xùn)泄露例子

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

調(diào)用fun()會(huì)導(dǎo)致分配給name的內(nèi)存被泄漏。以上代碼執(zhí)行后創(chuàng)建了一個(gè)內(nèi)部閉包,只要返回的函數(shù)存在就不能清理name,因?yàn)殚]包一直在引用著它。



猜你喜歡

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

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

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

分享到:
在線咨詢(xún) 我要報(bào)名
和我們?cè)诰€交談!