解决方案 »

  1.   

    大括号后的小括号表明函数立即运行  此时abc=function(){return ++i}
    i在父函数中定义  ++i中的i是父函数的i的引用  所以不会被释放  且累加
      

  2.   

    楼主给的代码是不是有问题?在第一个return后面应该有个“function”关键字,不然运行不了。
    支持1L观点:函数体后面跟()表示立即执行。
    我的理解是:匿名函数被定义的时候,将外部函数的对象添加到自己的作用域链中,因此可以访问外部函数中定义的变量(即i),而外部函数返回后,外部函数的作用域链被销毁,但是外部函数的变量对象(i)仍然存在于匿名函数的作用域中。因此变量i并不会被销毁,反而一直存在于匿名函数的作用域中,除非匿名函数也被销毁。
    如果要出现楼主的预期现象的话,应该:var abc=function(){
    var i=0; 
    return function(num){
    return function(){
    return ++num;
    }();
    }(i);
    }()
    这里等于加了一层闭包,最里面的函数保留的只是i的拷贝,而不是i对象的引用。这样,传递参数的时候,都是传递外部函数的i对象。而在执行++num的时候,他们解析的都是自己作用域内的num对象,而不是外部函数的i对象,因此不会出现自增长。
    后记:为了回答这个问题,看了好多关于闭包的知识!严重地涨姿势了!
      

  3.   

    1楼回答简洁,准确~后面的“()”是立即执行函数。
    内部函数访问了外部函数的变量形成闭包,也就是说外部函数执行完毕后 变量i不会被释放而被内部函数一直引用着。
    内部函数执行时访问的i永远是外部函数中i的最新值,而内部函数对i的每次操作也会对外部函数的i产生影响。
      

  4.   

    少年,你已经接触了js最扯蛋的地方:闭包。
    2楼说的没错,缺少一个function。
    然后回答你的问题:
    1. 你认为运行完之后释放了,恰恰相反运行完之后,由于ruturn function(){ ++i; }里边引用了i,所以不会被释放。释放的前提是,这个变量没有被引用,被垃圾回收器释放。
    为什么加了个function(){}之后就没被释放,这就要从js的作用域讲起,js的作用域是按function(){}划分,就是以function(){}为一些变量,参数可访问的有限区域。
    2. ()的作用,2楼讲立即执行也没错,不过通俗的理解来说是调用。你定义了一段代码片段,不去调用就没有(),想调用就有();是不是上面的听的有点晕,建议你去看看javascript高级程序设计,第三版,那书才是入门的,启示录,你目前消化起来可能要补的功课比较多,对学习的积极性也有打击。循序渐进,还是慢慢来,不浮躁,不急躁,不松懈,不气馁。我的一些经验分享一下:
    http://www.cnblogs.com/jikey/p/3613082.html