JavaScript 垃圾回收机制与内存泄漏

一.垃圾回收机制

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 中的闭包是什么

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值