40分请教闭包,希望解释清晰条理
首先:
function A(){
var a=10;
this.test=function(){
alert(a++);
}
}
var oNode1=new A;
oNode1.test(); // 10
oNode1.test(); // 11
var oNode2=new A;
oNode2.test(); // 10
oNode2.test(); // 11
函数内部包含着函数,于是有闭包。以前我没深入的想过,不同的对象执行的结果当然不一样,这里我们确实看见,a变量被保存着,但是new出不同的对象后,a还是重新开始计算。。。。以上并没有得到 10,11,12,13的结果。
于是我认为,奥,不同的对象来调,外部的活动对象不一样,所以是2个相互独立的闭包。
然后:
(function my(){
var m=10;
myObject=function(){}
myObject.prototype.xx=function(){
++m;
return m;
}
})()
var gg=new myObject;
var pp=new myObject;
gg.xx(); //10
gg.xx(); //11
pp.xx(); //12
pp.xx(); //13
因为 xx方法来自于原型,而且gg.xx==pp.xx,所以我会认为,其实外部的调用对象还是一致的,所以这里m的值因为闭包,一致保存着,作用于实例出来的各个对象。
但最后:
(function my(){
var m=10;
myObject=function(){
this.test=function(){
alert(++m);
}
}
})()
var gg=new myObject;
var pp=new myObject;
gg.test(); //11
gg.test(); //12
pp.test(); //13
pp.test(); //14
虽然pp和gg是两个不同对象,gg.test和pp.test也是不同的,但是m值都在内存中保留,所以我觉得跟前面有些矛盾,或者我没有办法很好的解释,到底什么是对,什么是错。。。。我觉得自己在一个误区里,一直没弄明白。求高人赐教。
------解决方案--------------------
function A(){
var a=10;
this.test=function(){
alert(a++);
}
}
var oNode1=new A;
oNode1.test(); // 10
oNode1.test(); // 11
var oNode2=new A;
oNode2.test(); // 10
oNode2.test(); // 11
每次new的时候里面的var a 都会重新创建(等于10) 所以没有累加 这是关键
(function my(){
var m=10;
myObject=function(){}
myObject.prototype.xx=function(){
++m;
return m;
}
})()
var gg=new myObject;
var pp=new myObject;
gg.xx(); //10
gg.xx(); //11
pp.xx(); //12
pp.xx(); //13
你的 myObject 没有var 所以是全局变量
所以你外面的my() 应该意义不大
每次new myObject的时候 执行xx的时候 都是给m++ 你的m没有重新定义 所以累加,这是关键
最后
“虽然pp和gg是两个不同对象,”
虽然是“不同对象”但是都是一个引用(具体看引用类型解释这里不多说)
------解决方案--------------------
还有闭包就是闭包,没有像你说的有什么相互独立的说法