javascript - 闭包的问题求高手讲解下
怪我咯
怪我咯 2017-04-11 13:00:51
[JavaScript讨论组]
function test(){
 var a=0;    
 var obj={};
 obj.fun=function(){
     return ++a;     
 }
 return obj.fun    
}
var t=test();
//t是一个函数,其内部变量是test函数的引用,test调用完毕t的作用域链不会被销毁
t();
t();
t();
alert(t());//4

test()();
test()();
test()();
alert(test()());//1
//我的理解是test每次调用都会初始化,所以结果都是1,但是test()代表的obj.fun的作用域链不会被删除不知道对不对

我的问题是test()()算闭包么,其中内存会不会被释放,还有闭包中的内存什么时候会被释放,只有关闭窗口时才会被释放么?
怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(1)
伊谢尔伦

首先正面回答你算闭包

其实闭包应该叫词法闭包函数闭包,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。

如果说要来解释内存的状态,我做了适当的改进这样看起来更直观一点:

var test = function() {
 var a=0;    
 var obj={};
 obj.fun=function(){
     return ++a;     
 }
 return obj.fun
}

var tt = test();
tt();

原则上当 test() 执行完后函数体内的东西应该被销毁,但由于返回的值 tt 是一个 function;并且里面还对 a 保存着引用,所以 test 执行过程中产生的 a 就不会被销毁,必须直到 tt 先被回收后才 a 才会被回收。

你试着和是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。这句话一起理解示例,你就明白了。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号