为了账号安全,请及时绑定邮箱和手机立即绑定

彻底弄懂Javascript闭包

标签:
Vue.js

基础概念

什么是闭包

简单来说,闭包是指可以访问另一个函数作用域变量的函数,一般是定义在外层函数中的内层函数。

为什么需要闭包呢

局部变量无法共享和长久的保存,而全局变量可能造成变量污染,所以我们希望有一种机制既可以长久的保存变量又不会造成全局污染。

特点
  • 占用更多内存

  • 不容易被释放

何时使用

既想反复使用,又想避免全局污染

如何使用

1.定义外层函数,封装被保护的局部变量。
2.定义内层函数,执行对外部函数变量的操作。
3.外层函数返回内层函数的对象,并且外层函数被调用,结果保存在一个全局的变量中。

函数生命周期

直接上图,点击图片方法查看。要记住函数对象、作用域链对象、执行环境(EC)和活动对象(AO)这几个东西都啥时候出现,啥时候消失。

函数生命周期

例子实战

看下面这个函数,函数对象的地址仅作标识,不代表真实的地址。

var getNum;//------------------------1function getCounter() { // ----------2
    var n = 1; 
    var inner = function () { return n++; }    return inner;
}

getNum = getCounter();//------------3console.log(getNum()); //1 ---------4console.log(getNum()); //2 ---------5

程序运行到2的时候:

运行到2

程序运行到3的时候:

运行到3

运行到4的时候,外层函数调用结束,AO对象释放,图中红线断了:

4处的代码执行前

4处的代码执行时:

执行4处的代码

4处的代码执行完:

4处代码执行完

总结:可以看到内层函数对象被全局的变量getNum引用,所以内层函数相关的AO对象,作用域链对象在函数调用完都无法被内存回收,因此占用了更多的内存空间,但是这样持久的保存了需要的n



作者:肖潇_
链接:https://www.jianshu.com/p/8963df48dad8


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消