【前端内存泄漏】一文详解内存泄漏的原理、原因、解决方案

奶茶要加菲 2024-08-20 08:03:01 阅读 57

首先,了解一下内存泄漏的概念:

程序在不需要使用某些对象或数据时,没有及时释放它们的内存,导致内存使用量不断增加,最终可能导致性能下降甚至浏览器崩溃。

比如:我在首页组件index.vue中定义了很多定时器setTimeout和全局变量,没有对定时器执行clearTimeout,也没有将全局变量清除掉,然后我切到个人中心user.vue中了,那这些定时器和全局变量还一直在内存里。一个页面还好,要是很多页面全是这种,那岂不是一会儿内存就爆了?这样的情况就被称为内存泄露。

会引起内存泄漏的原因

1. 莫名的全局变量

(1)变量未声明

<code>// 未声明的变量默认使用window创建,即全局变量。

function fnA() {

a = 123

}

fnA()

(2)this创建变量

// this指向的是永远是调用者

function fnB() {

this.a = 123

}

// 这里的fnB隐式调用,等价于window.fnB(),所以this指向的就是其调用者window

fnB()

全局变量还是要尽可能少用,如果用了,在合适的情况下,将其释放(将其赋值null或undefined)

2. 未清理的定时器

let timer1 = setTimeout(() => {

console.log(123)

}, 1000);

let timer2 = setInterval(() => {

console.log(123)

}, 1000);

// 在适当时机清除

clearTimeout(timer1);

clearInterval(timer2);

3. 闭包

闭包可以创建一个独立的环境,能让外部访问函数内部变量,但同时局部变量会常驻在内存中,长时间不被释放,造成内存泄漏。

(1)局部变量避免使用很大的对象

// 局部变量避免使用很大的对象

function createClosure() {

let largeObject = {

......

};

return function() {

console.log(largeObject);

};

}

// 大对象从外部传

function createClosure(largeObject) {

return function() {

console.log(largeObject);

};

}

(2)手动释放引用

function createClosure() {

let largeObject = {

......

};

let closure = function() {

console.log(largeObject);

};

// 使用完毕后清理

largeObject = null;

return closure;

}

希望能帮到你!



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。