闭包

在定义函数时就创建了一个作用域链并保存在函数的scope属性中,当调用函数时,会为函数创建一个执行环境,并通过复制scope属性中的对象(变量对象)构建起执行环境的作用域链,并创建该函数的活动对象(可做变量对象)放入作用域链的前端,因此更内层的函数的作用域链会被重新定义,而闭包则是内层函数被更外部的变量对象引用,而内层函数又引用了定义它的环境的活动对象

function getCounter(){
    var n = 0;
    return function(){return ++n}  //匿名函数在getCounter开始执行时并不存在在内存中
}

var getNum = getCounter();

当程序读到return 后的匿名函数时,就会创建一个函数对象,并在内存中生成一个地址,最后return给getNum的是一个地址;因为该匿名函数的地址被全局变量保存,该函数也就被引用了,所以不再是匿名函数,最后该函数的作用域链,函数对象,和对getCounter函数的活动对象的引用都能被保存下来;

匿名函数的优点:节约内存空间 // 匿名函数被读到了就创建2大对象(函数对象、作用域链对象)。
匿名函数只在调用时三大对象。函数对象和作用域链对象,读完后因为没变量保存函数对象的地址,函数对象就被销毁,因而作用域链也不能被保存下来;所以调用后三大对象都自动释放。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值