JavaScript 内存泄露大全

一.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 的问题,不是闭包的问题。 参考这篇文章

猜你喜欢

转载自blog.csdn.net/m0_48076809/article/details/106697682