本帖最后由 qiugua 于 2011-02-23 16:33:50 编辑

解决方案 »

  1.   

    var funcs<---createFunction()--->result--->new Array()=====>result[i]=(function(i){return function(){}})(i);-----i=1--10我看不单单是闭包问题吧 还有其他知识点 还没学透
      

  2.   

     等同于for (var i=0; i < 10; i++){
                        result[i] = i;
                    }
    楼主不必写的那样,要可读性好点,可以拆段写。
    for (var i=0; i < 10; i++){
                        result[i] = a(i);
                    }
    function a(num){   
      return b(num);
    }
    function b(i){
        return i;
    }
    不知道是否有性能上的异同。还请指点
      

  3.   

    懂了就不难理解了,关键代码就在:
    result[i] = function(num){
    return function(){
    return num;
    };
    }(i);
    这段代码的执行结果相当于:
    result[0]=function(){return 0;};
    result[1]=function(){return 1;};
    .
    .
    .
    result[9]=function(){return 9;};
    后面带(i)表示直接执行,i的值传给了参数num,内部函数的局部变量num受闭包影响,所以也等于外面的参数num的值。
      

  4.   

    这是什么书的内容,对于还没有搞清楚的人来说绝对累死从最里层function(){
                                return num;
                            };
    本身返回的num是其外部的那个num;即 function(num){...}传入的,此时的num对于上面的那个方法体是外部变量,所以上面的代码中没有重复的num所以可以获得,然后被返回; function(num){
                            return function(){
                                return num;
                            };
                        }(i)主要的是最后(i)的i,实际上就是这个方法体自执行了一次,情况就如:func = function(num){...};
    func(i);一样的效果。此时最外层的数组result[i]其实是被定义为一个方法体,情况如
    result[i] = func;
    结果是一样的;既然result[i]是一个方法,所以其实就可以好像func那样的调用

    func(i);  就是完全等同于 result[i](i);
    所以createFunctions()被实例的时候,实际就是createFunctions这个方法里面的result进行了10次的赋值操作,所以这个时候
    result[0]() = func(0) = 0;
    result[1]() = func(1) = 1;
    result[2]() = func(2) = 2;
    result[3]() = func(3) = 3;
    result[4]() = func(4) = 4;
    result[5]() = func(5) = 5;
    result[6]() = func(6) = 6;
    result[7]() = func(7) = 7;
    result[8]() = func(8) = 8;
    result[9]() = func(9) = 9;
      

  5.   

    究正自己一个问题,内部函数的num跟外面函数的参数应该算同一个参数,而不是“等于外面的参数num的值”。