HeroCL 2011-05-23 16:59
浏览 200
已采纳

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

 

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

 

求解啊。

 

  • 写回答

6条回答 默认 最新

  • iteye_12076 2011-05-25 09:43
    关注

    [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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)