JavaScript 垃圾回收-3

78 阅读2分钟

这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战

前言

吃饱饭才有力气写代码~

昨天学习了JavaScript的垃圾回收机制的性能和内存管理,今天学习一下内存泄漏以及静态分配与对象池。

内存泄漏

很多写的不好的JavaScript代码可能会出现不容易察觉但是有害的内存泄漏问题。在内存有限的设备上或者函数会被调用很多次的情况下,内存泄漏是个很大的问题。JavaScript中的内存泄漏大部分是由不合理的引用所致的。
意外生命全局变量是最常见的内存泄漏问题,比如:

function setName(){
    name = 'Tom';
}

这个代码没有使用任何关键字生命变量,此时解释器会把变量name当做Windows的属性来创建,相当于window.name = 'Jake',可想而知,在window对象上创建的对象,只要window本身不被清理就不会消失。这个问题解决的方法很简单,只需要在变量声明前头加上 var let 或 const 关键字即可,这样变量就会在函数执行完毕后离开作用域。
定时器也可能会导致内存泄漏,比如:

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

只要定时器一直运行,回调函数中引用的name就会一直占用内存。
使用JavaScript闭包也很容易在不知不觉间造成内存泄漏。

let outer = function(){
    let name = 'Tom';
    return function(){
        return name;
    };
};

这个代码创建了一个内部闭包,只要outer函数存在就不能清理name,因为这个闭包一直在引用着它。如果name不止是一个小小的字符串,而是一个内容很大的对象,那可能就是一个很大的问题了。对于这种闭包产生的内存泄漏,能避免应尽量避免。