为什么写闭包时要传一个参数进去啊,根据js作用域原理,内层的函数不是可以引用全局变量嘛

解决方案 »

  1.   

    闭包不一定要传一个参数进去,但是要引用一个局部变量,我们通过闭包把它传出来赋给全局变量,以使它在调用完之后还一直存在作用链域中,所占的内存空间不会被释放掉。下面的代码就是一个闭包。每一次调用才c(),o的值都会递增。如果b()没有引用o,那么每一次调用a()时o的值都为0。var c = null;       //定义全局变量c  
                        function a(){       //定义函数a  
                            var o = 0;      //定义函数a的局部变量o  
                            function b(){   //定义函数a的嵌套函数b  
                                o++;                //引用外围函数a的局部变量o,并自加  
                                return o;       //函数b返回o的值  
                            }  
                        return b;               //函数a返回其嵌套函数b  
                        }  
                        c = a();                //将调用函数a的结果赋给了全局对象c,此时c = b  
                        c();      
      

  2.   

    恩,看下面的代码
     window.onload=function(){
       var div=document.getElementsByTagName("div");
       for(var i=0;i<div.length;i++)
       {
         div[i].onmouseover=(function(i){
     return function(){
    div[i].style.borderColor="red"; 
     }   
     })(i),我想问的是这边的i一定要传进去吗??i不是全局变量吗?
     div[i].onmouseout=(function(i){
      return function(){
     div[i].style.borderColor="blue"; 
      }
     })(i)
       }
       }
      

  3.   

    这里的i不是全局变量,他是第一个匿名函数function()里面的局部变量。
      

  4.   

    楼主应该先理解“词法作用域”和“变量作用域”,你看下面例子,弄清楚了,就理解你的问题了
    var str = "111";function f1(){
    alert(str);
    }function f2(){
    var str = "222";
    f1();
    }f2();
    var str = "111";function f2(){
    var str = "222";
            function f1(){
        alert(str);
            }
            f1();
    }f2();
      

  5.   

    转的,
    在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数a被b引用,b又被a外的c引用,这就是为什么函数a执行后不会被回收的原因。