程序员鸡皮
文章 分类 评论
323 4 39

站点介绍

一名PHP全栈程序员的日常......

闭包的内存分析和解决

abzzp 2026-02-08 332 0条评论 前端 前端

首页 / 正文
本站是作为记录一名北漂程序员编程学习以及日常的博客,欢迎添加微信BmzhbjzhB咨询交流,喜欢吃红薯或粉条的也可以私聊我......

发布于2024-07-04

在前面的内容中,我们的程序中是否存在内存泄漏呢?我们详细来讲讲。

内存分析与解决

当然存在内存泄漏了,虽然我们的Javascript语言给出了GC垃圾回收器,但是对于上面图片中的内容。因为fn函数被相互调用,所以内存只要不手动清除是永远不会消失的。 这样相互调用的函数多了,那么就会出现内存泄漏。

var height = 1.88

function other(){
    var age = 18;
    function inner(){
     var name = "name";
     debugger;
     console.log(name,age,height);
    }
    return inner;
}

var fn = other();
fn();

在上面代码中,fn变量对Function Object(inner oxb00)是存在引用的,而inner对象又对AO1有引用。
对于V8引擎来说是不会帮我们自动清理些相互调用的内存的,那我们要如何解决呢?

解决内存泄漏

将fn函数设置为null就可以了。

解决内存后的效果图

闭包的内存泄漏测试

我们看一下下面代码:

function testArray(){
    var arr = new Array(1024*1024).fill(1)
    return function(){
        console.log(arr)
    }
}

var arr = []
var createBtnEl = document.querySelector(".create")
var destroyBtnEl = document.querySelector(".destroy")
createBtnEl.onclick = function(){

    for(var i=0;i<100;i++){
        arr.push(testArray())
    }
}

destroyBtnEl.onclick = function(){
    arr = []
}

上面代码自己测试吧!

AO不适用的属性优化

我们来研究一个问题:AO对象不会被销毁时,是否里面的所有属性都不会被释放?

下面这段代码中的name属于闭包的父作用域里面的变量。
我们知道形成闭包之后count一定不会被销毁,那么那么会不会被销毁。这里给你这段代码自己运行所示吧!

function makeAdder(count){
    let name = "why"
    return function(num){
        debugger
        return count + num
    }
}

const add10 = makeAdder(10)
console.log(add10(5))
console.log(add10(8))

感谢大家观看

评论(0)

文章目录

最新评论

  • 姓名测试打分

    文章不错支持一下,非常喜欢

  • 免费算命

    文章不错非常喜欢,支持一下

  • 凡梦星尘

    友链已经添加好了,欢迎回访哈

  • 生辰八字算命

    文章不错支持一下,非常喜欢

  • 免费算命

    文章不错非常喜欢,支持一下

  • 生辰八字算命

    文章不错支持一下,非常喜欢

  • 免费算命

    文章不错非常喜欢,支持一下

  • 茗辰原

    马克吐温的作品就很经典,小时候很爱看

  • 姓名测试打分

    文章不错支持一下,非常喜欢

  • 姓名测试打分

    文章不错非常喜欢,支持

日历

2026年11月

日一二三四五六
1234567
891011121314
15161718192021
22232425262728
2930     

站点公告
本站是作为记录一名北漂程序员编程学习以及日常的博客,欢迎添加微信BmzhbjzhB咨询交流,喜欢吃红薯或粉条的也可以私聊我......
点击小铃铛关闭
配色方案