更新時間:2021-10-14 來源:黑馬程序員 瀏覽量:
內存泄漏指任何對象在不再擁有或需要它之后卻仍然存在。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,因為閉包一直在引用著它。
猜你喜歡