美文网首页web前端
测试闭包的内存泄漏

测试闭包的内存泄漏

作者: 姜治宇 | 来源:发表于2022-04-12 17:06 被阅读0次

测试

了解了垃圾回收的计数原理,就知道为啥闭包会形成内存泄漏了。看这样一个简单的例子:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <button id="btn">开关</button>
</body>

</html>
<script>
    let btn = document.getElementById('btn');
    btn.addEventListener('click', () => {
        for (let i = 0; i < 100000; i++) {

            outer();

        }
    }, false);

    function outer() {

        let bar = [];

        function inner() {

            console.log(`引用堆内存 ${bar}`);//对堆内存有引用,没有释放内存

        }

    }


</script>
多按几次按钮,录制一下内存的使用情况: add.png

可以看到heap堆内存是一直飙升的,我们只需将inner()函数的console注释掉,内存就可以降下来了:


ok.png

闭包原理

闭包的原理很简单,就是关于堆内存是否释放的问题。

当声明outer函数时,堆内存有两处引用,此时引用计数就是2: 1.png
然后函数执行完毕,在函数作用域中的bar变量释放,引用计数变为1,此时是无法释放掉堆内存的: 2.png
如果inner函数没有对堆内存的引用,此时引用计数为0,堆内存可以回收: 3.png

相关文章

  • 测试闭包的内存泄漏

    测试 了解了垃圾回收的计数原理,就知道为啥闭包会形成内存泄漏了。看这样一个简单的例子: 多按几次按钮,录制一下内存...

  • iOS内存泄漏易错点

    问题 记录一个内存泄漏的案例,闭包引用自己或者多个对象,导致对象无法正常销毁,从而导致内存泄漏。 上面例子的闭包中...

  • 闭包1(基础)

    (什么是闭包?闭包的作用?闭包的缺陷?) (闭包的几种可能的应用场景) (闭包与内存泄漏,有关闭包的面试题) 推荐...

  • 什么是闭包?闭包的好处是什么?

    什么是闭包,闭包的好处 闭包 : 再函数外部可以访问函数内部的变量 好处: 坏处: 容易造成内存泄漏 闭包的相关应...

  • 深入JavaScript Day04 - 闭包、this的四种绑

    一、闭包补充 1、闭包是如何导致内存泄漏的?如何解决? window【持有】了闭包函数,闭包函数【持有】了父级AO...

  • 闭包及获取内部方法

    闭包获取内部方法。 闭包的概念 作用域、作用域链(防止内存泄漏) 避免泄漏,写在匿名函数中,模仿块级作用域。这样匿...

  • 闭包和内存泄漏

    作者: 叶茂;标签: 闭包,内存泄漏 序章 词法作用域:作用域是由书写代码时函数声明的位置决定的。 闭包 闭包就是...

  • 闭包的作用

    闭包:内部函数保存到外部 当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄漏(内存...

  • 闭包

    闭包:外层函数能够访问内层变量的函数,缺点就是容易造成内存泄漏。

  • 闭包以及内存泄漏

    闭包通俗点来说就是函数外面访问函数内部的变量 当程序执行完var inner = outer(),其实outer的...

网友评论

    本文标题:测试闭包的内存泄漏

    本文链接:https://www.haomeiwen.com/subject/sdrnsrtx.html