一.JavaScript 的垃圾回收机制
JavaScript中最常用的垃圾回收机制是标记与清除(mark-and-sweep)。当变量进入环境(例如,在函数中声明一个变量)时,就将这个变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占的内存,因为只要执行流进入相应的环境,就可能用到它们。而当变量离开环境时,这将其标为“离开环境”。
function test(){
let a = 10 ; // 被标记 ,进入环境
let b = 20 ; // 被标记 ,进入环境
}
test();
二. 什么是内存泄漏?
当应用程序不再需要占用内存的时候,由于某些原因,内存没有被系统回收
三. 常见的js内存泄漏?
1.意外的全局变量
//"use strict"
foo()
function foo(){
word = "this is a global variable"
}
console.log(word);
意外创建了一个全局变量,挂载到window上,使用"use strict"启用严格模式
2.定时器(setInterval)
使用clearInterval来取消
var someResource = new Date().toLocaleString();
setInterval(function() {
var node = document.getElementsByTagName('body');
if(node) {
node.innerHTML = JSON.stringify(someResource);
}
}, 1000)
3.绑定了监听事件 addEventListener
在页面销毁时使用removeEventListener移除对应的监听事件
闭包会导致内存泄露吗?
正确的答案是不会。
内存泄露是指你用不到(访问不到)的变量,依然占据着内存空间,不能被再次利用起来。
闭包里面的变量就是我们需要的变量,不能说是内存泄露。
这个误解是如何来的? 因为 IE。IE 有 bug,IE 在我们使用完闭包之后,依然回收不了闭包里面引用的变量。 这是 IE 的问题,不是闭包的问题。 参考这篇文章