更新時間:2021-10-14 來源:黑馬程序員 瀏覽量:
內(nèi)存泄漏指任何對象在不再擁有或需要它之后卻仍然存在。JavaScript中的內(nèi)存泄漏大部分是由不合理的引用導(dǎo)致的。
下面我們介紹幾種常見的造成內(nèi)存泄露的情況
1、意外聲明全局變量是最常見也最容易修復(fù)的內(nèi)存泄漏問題,比如:
function fn() { name = '張三'; }
解釋器在解釋上面的函數(shù)時,會把name當(dāng)做全局變量,即window.name =
'張三'。只要window對象沒有被清理,那么name屬性和屬性值將一直存在,造成內(nèi)存泄露。
解決方法:
(1)只要在變量聲明前面加上var、let或const關(guān)鍵字即可,這樣變量就會在函數(shù)執(zhí)行完畢后離開作用域。
(2)使用this關(guān)鍵字
function fn() { this.name = '張三'; }
(3)可以在 JavaScript 文件開頭添加 “use strict”,使用嚴(yán)格模式。這樣在嚴(yán)格模式下解析 JavaScript 可以防止意外的全局變量
(4)在使用完之后,對其賦值為null或者重新分配
2、 定時器導(dǎo)致的泄露
let name = '張三'; setInterval(() => { console.log(name); }, 100);
上面的代碼中,只要定時器一直運行,回調(diào)函數(shù)中引用的name就會一直占用內(nèi)存。
3、閉包、控制臺日志、循環(huán)(在兩個對象彼此引用且彼此保留時,就會產(chǎn)生一個循環(huán)),下面我們看一個JavaScript閉包導(dǎo)致的內(nèi)訓(xùn)泄露例子
let fun = function() { let name = '張三'; return function() { return name; }; };
調(diào)用fun()會導(dǎo)致分配給name的內(nèi)存被泄漏。以上代碼執(zhí)行后創(chuàng)建了一個內(nèi)部閉包,只要返回的函數(shù)存在就不能清理name,因為閉包一直在引用著它。
猜你喜歡