两断神奇的代码,谁能告诉我为什么???

 

function outerFunc()
{    
    var privateAttr = 10;  
  
    function innerFunc()
    {  
        privateAttr *= 2;  
        console.log(privateAttr);
        return privateAttr;   
    }  
   
    return innerFunc;  
}  
  
var refInnerFunc = new outerFunc();  
  
 
refInnerFunc(); 
 
refInnerFunc(); 

  
var refInnerFunc2 = new outerFunc();  
refInnerFunc2(); 

 

 

var MyNamespace = {};
  
MyNamespace.TreeItem = (function()
{        
    var numTreeItems = 0;  
      
    function counter()
    {  
        numTreeItems ++;  
        console.log("Created "+numTreeItems+" tree items!");  
    //alert(numTreeItems);
    } 
        
    return counter;
})(); 
  
var treeItem1 = new MyNamespace.TreeItem(); 
var treeItem2 = new MyNamespace.TreeItem();

 第一段执行的结果是20 40 20

 

第二段执行结果  Created 1 tree items!   Created 2 tree items!

 

两端代码差别就是一个匿名函数,为什么结果不一样???同样是new两个对象,为什么???

 

是看了这两篇文章后想到http://hbc8848.iteye.com/blog/798724http://hbc8848.iteye.com/blog/798154

 

求解啊。

 

[code="javascript"]

function outer() { //使用闭包产生的私有静态变量,不可被外部访问 var numTreeItems = 0; //使用闭包产生的私有静态方法,不可被外部访问 function counter(){ numTreeItems ++; alert("Created "+numTreeItems+" tree items!"); } return counter; } var MyNamespace = {TreeItem : outer()}; var s1 = outer(); var s2 = outer(); s1(); // 1 s2(); // 1 MyNamespace.TreeItem(); //1 MyNamespace.TreeItem(); //2 new MyNamespace.TreeItem(); //3

[/code]

哥们,这两段代码我觉得一点都不神奇。

我是这样理解的:因为第二段代码中MyNamespace.TreeItem在定义时已经指向了counter函数,这样每次new时都是在new了外层函数下的counter函数,都是在同一个变量numTreeItems下。

我表述的不是很清楚。你可以将代码改为一下形式,参照一下。
MyNamespace.TreeItem = function()

{

var numTreeItems = 0;

function counter()  
{    
    numTreeItems ++;    
    console.log("Created "+numTreeItems+" tree items!");    
//alert(numTreeItems);  
}   

return counter;  

};

var treeItem1 = new MyNamespace.TreeItem()();

var treeItem2 = new MyNamespace.TreeItem()();

你这就是第一种形式,对于匿名闭包还是没解释清楚

我确实没有解释清楚,因为这不是一句话的事,而且要说的东西我也不是很清楚。

这是function是如何运行的问题,放到哪里都会这样运行,和“匿名”、“闭包”没有关系。

闭包内的微观世界
http://hi.baidu.com/netwolf103/blog/item/4163bb3443afbc335bb5f5e3.html

[code="java"]
var MyNamespace = {};

MyNamespace.TreeItem = (function()

{

var numTreeItems = 0;

 function counter()  
 {    
     numTreeItems ++;    
     console.log("Created "+numTreeItems+" tree items!");    
 //alert(numTreeItems);  
 }   

 return counter;  

})();

var treeItem1 = new MyNamespace.TreeItem();

var treeItem2 = new MyNamespace.TreeItem();
[/code]

这段代码是有些问题的,
MyNamespace.TreeItem = (function()

{
.....
})();
MyNamespace.TreeItem本身是一个函数的结果,而不是函数。把后面那个()去掉就可以了。