更新時(shí)間:2021-10-14 來(lái)源:黑馬程序員 瀏覽量:
內(nèi)存泄漏指任何對(duì)象在不再擁有或需要它之后卻仍然存在。JavaScript中的內(nèi)存泄漏大部分是由不合理的引用導(dǎo)致的。
下面我們介紹幾種常見(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)殚]包一直在引用著它。
猜你喜歡