日期:2014-05-16  浏览次数:20311 次

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是两个不同对象,”
虽然是“不同对象”但是都是一个引用(具体看引用类型解释这里不多说)


------解决方案--------------------
还有闭包就是闭包,没有像你说的有什么相互独立的说法