简单来说,假设函数A在函数B的内部进行定义了,并且当函数A在执行时,访问了函数B内部的变量对象,那么B就是一个闭包。
这个解释不准确。简而言之闭包就是运行时能访问另外一个函数内的变量的函数。例如:function A(){ var a="aa"; return function B(){alert(a)}}; funcA = A()。A和B都不算是闭包,A和B组合成构造了闭包环境,真正的闭包是funcA。即A函数包变量a封闭起来了,外面无法访问,但是提供了一个包B函数可以访问。A和B一闭一包。上面那句话可以解释为: 闭包就是运行时(funcA())能访问另外一个函数(A)内的变量(a)的函数(funcA)。
我觉得作用域链应该是当前执行上下文的变量对象和上层环境的活动对象的集合,因为内部函数被激活时,外部函数已经开始执行了,此时外部函数得变量对象已经是活动对象了!不知道是否可以这么理解!?
思考了很久。我认为闭包是被动的,而真正的闭包是外部函数而不是内部函数。
首先理解一个,当函数被声明时其实已经对函数中的变量进行了访问。如function fn1(){return a},此时外部函数foo中的a=10就被访问了,只是fn1()没有执行,所以不会return,但从chrome设置断点看此时(fn2()被调用前)fn1中的a的值已经是10了。
回归正题,当任一内部函数(如fn1,fn2,fn3....)对外部函数(如foo)的变量对象进行访问时,外部函数“被动”成为闭包,成为闭包后所有内部函数都拥有外部函数的变量对象的“显式”索引,为什么说是显式的,难道还有隐式的?是的,因为内部函数本身就对外部函数的变量对象有访问权(理解为隐式索引)。那么显式索引是干嘛的?答案:是为了对抗垃圾回收机制。
这样就可以解释demo7中为什么fn1存在时形成闭包,不存在时不形成闭包了。因为fn1声明时对外部变量对象进行了访问。
综上所述:闭包与不闭包决定了当垃圾回收机制来临时会做何处理。
大家好,我是用时间酿酒。 写文不到2年,已出版1本书,第二本上个月刚刚签约完稿。 全文近8000多字,满满的干货,同时为了降低大家的阅读压力,所有重点内容已加粗处理。 大家可...