JavaScript 关于闭包的思考 总结

最近在看Javascript,起初认为闭包仅仅就是函数访问外部的变量这么简单,但是后来接触到一个简单的递归函数的时候,才开始了对闭包的思考。闭包可以说是一种底层机制的上层体现(我是这么认为的)。是先有了底层的垃圾回收及作用于链、引用等机制,才进而产生了“闭包”。

 

  • 闭包是指有权访问另一个函数作用于中的变量的函数【引自《Javascript高级编程第二版》P144】。定义很简单~但也太浅显。定义中没有提及闭包的潜在功能和其意义,所以还需要我们继续探索,闭包究竟可以为我们做什么。

 

作用域链

  • 在创建一个函数的时候,会预先为其创建一个包含全局变量对象的作用域链,保存在一个特殊内部属性Scope中
  • 当某个函数第一次被调用时会创建一个执行环境及相应作用域链,并赋值给Scope
  • 使用this、arguments和其他参数的值初始化函数的活动对象

    有了上面三步,一个函数的作用域链便组合完毕。外部函数的活动对象是始终处于内部活动对象之后的!所以其作用域链中包含两个变量对象:1本地活动对象;2全局变量对象。(只引用,不包含)

 

一般函数执行完毕后,局部活动对象就被销毁,,内存中仅仅保存全局作用于。但闭包的情况不同!

    上例形象的说明了,函数kkk在执行完之后,其局部活动对象中a并没有被回收,因为在一个匿名函数的作用域链中被引用,而且此匿名函数被外部的fun引用。所以,仅仅是kkk的执行环境作用域链被销毁了,而活动对象仍然在内存中,直到引用者--匿名函数被销毁。

 

    !闭包,会携带作用域,占用内存!

 

闭包变量

  • 闭包会取其执行时状态的外部变量值!而不是定义时状态~[个人理解]。(定义时并不执行,因为只绑定变量,不绑定变量值。所以在运行时绑定变量值的时候,或许值就早已不是你定义时想要的值了。)看下面的例子~:

    上例在运行的时候,到第二个for循环中才去分别调用匿名函数,去返回i,但是那个时候的i已经早早变成10了,因为还存在引用所以没被销毁(闭包)。不是我们想要的提示1、2、3之类的。这是闭包容易出现的一个问题。怎么解决呢?呵呵当然是想办法取消那个运行时才返回的i了,我们可以让它提前返回:

     注释中仅代表我个人的理解。

 

this对象

 

  • This对象是个很让人上火的对象,变来变去,不知道哪个是哪个。研究下再议~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值