一.垃圾回收机制
JavaScript中最常用的垃圾回收机制是标记与清除(mark-and-sweep)。当变量进入环境(例如,在函数中声明一个变量)时,就将这个变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占的内存,因为只要执行流进入相应的环境,就可能用到它们。而当变量离开环境时,这将其标计为“离开环境”。
function test(){
let a = 10 ; // 被标记 ,进入环境
let b = 20 ; // 被标记 ,进入环境
}
test(); //执行完毕后之后,a和b又被标记"离开环境",被回收
二. 什么是内存泄漏?
当应用程序不再需要占用内存的时候,由于某些原因,内存没有被系统回收
三. 常见的js内存泄漏?
1.意外的全局变量
//"use strict"
foo()
function foo(){
word = "this is a global variable"
}
console.log(word);
意外创建了一个全局变量,挂载到window上,使用"use strict"启用严格模式
2.未清理的定时器
定时器(setInterval 和 setTimeout)的回调函数如果没有清理干净,也会导致内存泄漏。
var intervalId = setInterval(function() {
console.log('定时器');
}, 1000);
// 解决方法:在不需要时清理定时器
clearInterval(intervalId);
3. DOM 引用未解除
var a = document.getElementById('id');
document.body.removeChild(a);
不能回收,因为存在变量a对它的引用。虽然我们用removeChild移除了,但是还在对象里保存着#的引用,即DOM元素还在内存里面。
解决方法: a = null;
4.未解除事件监听器
function detachEvent() {
var element = document.getElementById('myElement');
var handler = function() {
console.log('Element clicked');
};
element.addEventListener('click', handler);
// 移除监听器
element.removeEventListener('click', handler);
}
四.闭包会导致内存泄露吗?
正确的答案是不会。
内存泄露是指你用不到(访问不到)的变量,依然占据着内存空间,不能被再次利用起来。
闭包里面的变量就是我们需要的变量,不能说是内存泄露。
这个误解是如何来的? 因为 IE。IE 有 bug,IE 在我们使用完闭包之后,依然回收不了闭包里面引用的变量。 这是 IE 的问题,不是闭包的问题。JS 中的闭包是什么