闭包—Functions that return functions

原文传送门:JS 奥义解析(4):闭包


Functions that return functions

这是我见过的最简洁优雅的对于闭包的定义,并且形式上或者从外表来看,确实就是这样的,当然,即使是这样,这个定义要成立也应该还有两个前提:

  1. 你必须了解作用域(scope), JavaScript的作用域可以简单的说是由函数分隔或者界定的,所有我们称之为函数导向(function oriented)。

  2. 你必须了解垃圾回收机制(garbage collection)的引用计数(reference count)。

  3. 函数界定的函数导向的作用域决定了子级及子级以下作用域可以访问父级及父级以上作用域,反之则不行;垃圾回收机制的引用计数决定了一个变量如果不在被引用就会被垃圾回收。

说到这里其实问题就很明显了,可以猜出这里边可能涉及一个变量(不用说也可能是多个,毕竟大家都是举一反三的人),这个变量不会被回收,但是不会被回收还不足以突出他的与众不同之处,因为所有的全局变量都不会被回收,那么在结合它的名字这么一推导,闭包这个词根据语义化可能是用来装东西的,包嘛,毕竟用来装变量也是很合理的,这就印证了它用来装东西的猜想,这时候再结合functions that return function一想机会也就明白了,在父级作用域里定义一个变量,在子级作用域引用它,并且让它不会被回收,前面说过,全局作用域的变量是不会被回收的,所以顺利成章的把子级作用域也就是这个函数(函数导向的嘛,可以粗略理解为作用域就是一个函数)return 出去给全局作用域。你可能会诟病return出去之后不一定是给的全局作用域,但是对于子级作用域来说它父级的父级作用域那就可以理解成全局作用域,毕竟青蛙看到的也不过井口大的天,你得设身处地的去换位思考,所以变通一下嘛,别在不该聪明的时候聪明(另外,聪明是贬义词)。

所以聪明应该在大多数人只发现缺点的时候你用聪明去发现优点,大多数人在诟病的时候你用聪明去寻找一个合适的解释,去循着这个东西被创造、被命名的轨迹寻找那些闪闪发光的地方,吐槽很廉价,特别是没有经过认真思考的吐槽。甚至不应该帮助不经过认真思考不经过努力的人,因为那不过是浪费时间。

当你真正理解了返回函数的函数这个概念之后,真正的运用就在于你了,至于你是将其用作一个闭包,一个工厂,还是另做它用,就完全存乎你一心,这时候你可以说你掌握了闭包,掌握了工厂,理解了函数不过是一个变量,你可以说出一百种花样来,也可以说只有一招,只是运用这一招的你已经不再拘泥于这一招。

当然读到这里你应该脑子里已经闪过了另一个概念,如果没有,那就应该再学习了。与scope相对应的运行时上下文(runtime context), 这个是对象导向(object oriented)的,这里所指的对象是狭义的对象可以理解为{}。说的简单一点就是运行的时候,this等于哪个对象,你在用this点这点那的时候具体执行哪个对象里的属性或者方法,这也是为什么要加运行二字的原因。

JavaScript里Math对象和空对象{}其实具有同样的潜能,一样的强大,只不过空对象你得自己费尽去扩展,等同于人来说就是努力付出。但为什么又说每个人都具有同样的潜能呢,因为Math也可以扩展,人生就向一个状态机,不管你处于什么样的状态,只要还在努力付出,那就没有行或者不行,没有优秀或者差劲,只要还在不懈的追求,人生就具有不可比性,因为你永远不知道孰优孰劣。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值