JS闭包(图解)

代码

function foo(){
    var name="foo"
    var age=18
    function bar(){
        console.log(name)
        console.log(age)
    }
    return bar
}
var fn=foo()
fn()

分析

在这里插入图片描述
//第11行代码执行 , 生成AO对象。

在这里插入图片描述
//接下来执行函数中的代码:
在这里插入图片描述
//函数执行上下文会被销毁;但是AO1对象不会被销毁。
在这里插入图片描述
//0xb00对象不会被销毁 , 因为有fn指着它(全局GO中的变量)。

//0xb00中又有引用指向了AO1对象。

  • //根对象在这里就是GO对象了。

//从根对象出发 , 如果没有某个引用指着X对象了 ,那么X对象就会被销毁。

//fn( ) 要开始执行了。创建Fn的函数执行上下文。
在这里插入图片描述
//bar函数在当前的AO2中没有找到name , 于是就又跑到parentScope中寻找 , 找到了。

//fn()执行完毕 , 函数上下文弹栈。
//本来bar的上下文对象是指着0x300的,但是弹走了,就没有东西指向0x300了~
在这里插入图片描述
//归根结底 , 是因为父级作用域parentScope指着AO对象 , 所以AO对象没有被销毁。

//bar函数对象不会被销毁 , 所以后面的代码能够直接使用这个bar函数 ;

//——也正是因为bar函数没有被销毁 , 所以bar函数中的parentScope对象一直指着AO1对象,AO1对象也不会被销毁。

//但又如果说:bar函数只执行一次 , 那么保存AO1对象(0x200)和bar函数对象(0xb00)都是没有意义的。

这样就形成了闭包 , 闭包在一定程度上是有内存泄漏的,我只使用一次bar函数 , 但是bar函数对象和AO1对象却一直存在着,但是这种内存泄漏在一定程度上又取决于你是否要继续使用,这种内存泄漏在你不使用的情况下 , 应该被销毁掉!——fn=null.

//当我们执行代码 fn=null; 的时候上图就会变成下图的样子:
在这里插入图片描述
//从GO出发 , 右侧的两个对象0x200和0xb00虽然能够互相引用,但是脱离了GO的管控 ,自然就要被销毁了~
在这里插入图片描述
此时如果执行下面所述的代码 , 那么foo对象也会被销毁!

foo=null;

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值