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

但如果这些嵌套的函数对象在外部函数中保存下来,那么他们也会和所指向的变量绑定对象一样当做垃圾回收。

但如果这些嵌套的函数对象在外部函数中保存下来,那么他们也会和所指向的变量绑定对象一样当做垃圾回收。

慕尼黑5688855 2019-05-23 19:54:43
js权威指南-第六版-中p184实现闭包,有段话理解不了;全文是这样:每次调用js函数时,都会为之创建一个新的变量对象用来保存局部变量,把这个对象添加至作用域链中。当函数返回时,就从作用域链中将这个绑定的变量对象删除。如果不存在嵌套的函数,也没有其他引用指向这个绑定对象,他就会被当做垃圾回收掉。如果定义了嵌套的函数,每个嵌套的函数都各自对应一个作用域链,并且这个作用域链指向一个变量绑定对象。但如果这些嵌套的函数对象在外部函数中保存下来,那么他们也会和所指向的变量绑定对象一样当做垃圾回收。但是如果这个函数定义了嵌套的函数,并将它作为返回值返回或者存储在某处的属性里,这时就会有一个外部引用指向这个嵌套的函数,他就不会被当做垃圾回收,并且他所指向的变量绑定对象也不会被当做垃圾回收。我分成三段理解:1、每次调用js函数时,都会为之创建一个新的变量对象用来保存局部变量,把这个对象添加至作用域链中。当函数返回时,就从作用域链中将这个绑定的变量对象删除。如果不存在嵌套的函数,也没有其他引用指向这个绑定对象,他就会被当做垃圾回收掉。可以理解上面一段,下面两段不太清楚;2、如果定义了嵌套的函数,每个嵌套的函数都各自对应一个作用域链,并且这个作用域链指向一个变量绑定对象。但如果这些嵌套的函数对象在外部函数中保存下来,那么他们也会和所指向的变量绑定对象一样当做垃圾回收。3、但是如果这个函数定义了嵌套的函数,并将它作为返回值返回或者存储在某处的属性里,这时就会有一个外部引用指向这个嵌套的函数,他就不会被当做垃圾回收,并且他所指向的变量绑定对象也不会被当做垃圾回收。结合高程,可以理解3、,因为换成代码就是这样:functioncreateComparisonFunction(propertyName){//并将它作为返回值返回returnfunction(object1,object2){varvalue1=object1[propertyName];varvalue2=object2[propertyName];if(value1value2){return1;}else{return0;}};}//创建函数varcompareNames=createComparisonFunction("name");createComparisonFunction()函数在执行完毕后,其活动对象也不会被销毁,因为匿名函数的作用域链仍然在引用这个活动对象。这个很好理解;但是2、比较模糊,换成代码我觉得就是下面这样,functioncreateComparisonFunction(propertyName){//但如果这些嵌套的函数对象在外部函数中保存下来functionf(object1,object2){//嵌套的函数都各自对应一个作用域链varvalue1=object1[propertyName];//这个作用域链指向一个变量绑定对象varvalue2=object2[propertyName];if(value1value2){return1;}else{return0;}}returnf;}varcompareNames=createComparisonFunction("name");所以问题是:varcompareNames=createComparisonFunction("name");执行完了后,createComparisonFunction()的活动对象会被销毁么?回答1:会销毁,因为按照2、所说,但如果这些嵌套的函数对象在外部函数中保存下来,那么他们也会和所指向的变量绑定对象一样当做垃圾回收。返回的f在外部函数中保存下来了,所以会和所指向的变量绑定对象一样当做垃圾回收。回答2:不会销毁,因为返回的f里依然保存着对createComparisonFunction()活动对象的引用啊,就是那个propertyName,所以createComparisonFunction()活动对象不会销毁;所以哪个解释是对的?还是有其他解释?
查看完整描述

2 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

如果定义了嵌套的函数,每个嵌套的函数都各自对应一个作用域链,并且这个作用域链指向一个变量绑定对象。但如果这些嵌套的函数对象在外部函数中保存下来,那么他们也会和所指向的变量绑定对象一样当做垃圾回收。
一共两句话。前面那句只是说嵌套函数也有自己的作用域链和变量绑定对象,所以主要是后面那一句。这句话的意思是,外部函数可以在其变量绑定对象中保存嵌套函数的引用,但是如果没有把嵌套函数返回给其他代码,那么当外部函数销毁的时候,其保存的嵌套函数也会同时被销毁回收。
翻译成代码是这样的:
functionouter(){
vara=3;
functioninner(){
varb=5;
}
//这时候outer的变量绑定对象里面有a和inner两个变量
//所以当outer被回收的时候,a和inner也会被同时回收
...
}
第三段话则比上面这段话的意思更进了一步。
但是如果这个函数定义了嵌套的函数,并将它作为返回值返回或者存储在某处的属性里,这时就会有一个外部引用指向这个嵌套的函数,他就不会被当做垃圾回收,并且他所指向的变量绑定对象也不会被当做垃圾回收。
如果inner被outer作为返回值返回的话,那么就不仅仅是outer保有它的引用了,外面会有其他变量也保有它的引用。所以当outer被回收的时候,inner并不会回收。
                            
查看完整回答
反对 回复 2019-05-23
  • 2 回答
  • 0 关注
  • 382 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信