javascript闭包和匿名函数同时使用的问题
闭包明白是什么意思,而且也知道它是具有全局作用域的并且是存在内存中不会消失,匿名函数也知道意思,但是两个一起用就有点糊涂了代码:functionbox(){(functi...
闭包明白是什么意思,而且也知道它是具有全局作用域的并且是存在内存中不会消失,匿名函数也知道意思,但是两个一起用就有点糊涂了 代码:
function box(){
(function(){
for(var i = 0;i<5; i++){
alert(i)
}
})();
}
box();
如代码 这已经形成了一个闭包,那么根据闭包的定义,它具有全局作用域的并且值是存在内存中不会消失,那么匿名函数的定义是相当于块级私有域,在函数内部所执行的变量结束以后会销毁,那么问题来了,怎么解释闭包中包含匿名函数,一个是存在内存中的全局作用域一个是执行完销毁的私有作用域,这两个不是矛盾么,为什么还可以一起使用,最后的按照上面的代码最后结果是运行了匿名函数的私有作用域 i 被销毁,请解释闭包和匿名函数怎么就能共用。 展开
function box(){
(function(){
for(var i = 0;i<5; i++){
alert(i)
}
})();
}
box();
如代码 这已经形成了一个闭包,那么根据闭包的定义,它具有全局作用域的并且值是存在内存中不会消失,那么匿名函数的定义是相当于块级私有域,在函数内部所执行的变量结束以后会销毁,那么问题来了,怎么解释闭包中包含匿名函数,一个是存在内存中的全局作用域一个是执行完销毁的私有作用域,这两个不是矛盾么,为什么还可以一起使用,最后的按照上面的代码最后结果是运行了匿名函数的私有作用域 i 被销毁,请解释闭包和匿名函数怎么就能共用。 展开
2个回答
展开全部
你这个代码哪里形成闭包了?
这么说吧,任何函数和其定义时所处环境都构成闭包,只是你的代码中没有体现对闭包的应用吧
纠正一点,任何在函数中定义的变量都是在函数的私有作用域中,所谓全局作用域只存在global对象中(浏览器中的window)
我们通常说闭包,是说在外部函数内部定义的函数引用了在外部函数定义的变量,在外部函数执行完成时,造成该变量对应内存没有被回收,于是内部函数与这个变量就形成了闭包
比如
function A() {
var i = 1;
return {
B: function () {
alert(i);
},
C: function () {
i++;
}
}
}
var D = A();
D.B();
D.C();
D.B();
对于A来说,A执行完,在A中的局部变量所占内存应该销毁
函数B,函数C的定义中引用了A的私有变量i ,B和i 就形成闭包 ,C和i也形成闭包,造成GC不能回收i所占内存, 但是只有在B,C中能访问到i,外部是无法直接访问i的,外部只有通过B,C才能访问i,在外部看来i就是A的私有变量啊
追问
我的意思是既然任何在函数中定义的变量都是在函数的私有作用域中,那么匿名函数存在的意义何在呢?
展开全部
只要函数中存在函数就会形成闭包,这与是否具有全局作用域没有关系。比如你的例子,的确是一个闭包,但是匿名函数没有访问上层作用域中的任何东西,但是的确可以访问到,这就是闭。一个很简单的例子
function box(){
for(var i=0,n=dom.length;i<n;i++){
dom[i].onclick=function(i){
return function(){
alert(i)
}
}(i);
}
}
同样,如下的具名函数同样也形成了闭包
function box(){
function a(){
for(var i = 0;i<5; i++){
alert(i)
}
};
a();
}
记住很简单的一条规则,只要某个函数中存在函数,就是闭包。内部函数就能获取到外部函数的作用域
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询