js 闭包为什么不会回收的原因

<!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>
    <script>
        // 了解闭包前,要知道垃圾回收机制,超级简单来说,就是window对象上能
        // 访问到的变量会被存储下来,称作可达对象,没被引用的会被回收。
        // 函数执行前会在执行上下文创造vo对象,可以直接理解成一个对象。
        // 分为go,ao。go.window=this,所以window就是go的一个引用,
        // 可以直接理解成go就是window。ao是函数内部秘密创建的,无法访问到。
        // 比如在全局作用域下,vo -> go。在普通函数内vo->ao。
        // 下面来分解这段代码。

        function foo(params) {
            var name = 'foo'
            function bar() {
                console.log(name);
            }
            return bar
        }
        var fn = foo();
        fn()
        // go全局对象,就是window。
        var Object_go = {
            foo: foo_fn,//函数是在堆内存里面的,所以是一个地址(指针),我这里用对象代替
            fn: undefined,
        }
        // 可以理解成foo函数在堆内存中的存储的表现形式
        var foo_fn = {
            scope: Object_go,
            //作用域链,可以理解成原型链一样的东西。比如一个对象找属性都是一层一层往上找的,
            // 作用域链差也是。先从自身的ao对象上查找,再找作用域连上的。
            content:    `var name = 'foo'
                        function bar() {
                            console.log(name);
                        }
                        return bar`  
        }
        // 执行阶段到var fn = foo()这一段就形成了闭包的引用。
        //碰到 var fn = foo();这一句时执行函数,执行上下文栈之类的就不讲了。就按照这种简单的方式理解吧。
        // 创建ao对象。foo_Object_ao
        var foo_Object_ao={
            name:'foo',
            bar:bar_fn,
        }
        var bar_fn={
            scope: foo_Object_ao ,
            content:'console.log(name);'
        }
        // var fn = foo() 赋值操作。
        var Object_go = {
            foo: foo_fn,//函数是在堆内存里面的,所以是一个地址(指针)
            fn: bar_fn,
        }
        // 现在来看可达对象的那里的理解。Object_go全局对象。也就是window。
        // Object_go.fn -> bar_fn   bar_fn.scope->foo_Object_ao   
        //  这样就形成了引用。也就是这样为什么foo()执行后,bar函数还能访问name,而没有被回收的原因。
    </script>
</body>

</html>

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值