这是我参与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不止是一个小小的字符串,而是一个内容很大的对象,那可能就是一个很大的问题了。对于这种闭包产生的内存泄漏,能避免应尽量避免。