JS闭包讲解二(较全)

来源:互联网 发布:dnf第三方和数据异常 编辑:程序博客网 时间:2024/04/27 17:42

关于闭包的详细解析:

例子1:

   function getFuns()

         {

                   varret = new Array();

                   for(var i = 0 ;i < 10 ; i ++)

                   {

                            ret[i]= function(){ ----------------->fun1

                               log(i);

                               return i;

                            };

                   }       

                   returnret;

         }       

         //

         varfuns = getFuns();

         funs[0]();//这里打印10;

         funs[1]();//这里打印10;这里的结果都是10;

        

         分析:由于,fun1ret数组保存,所以,getFunsfun1两个函数的环境被保留下来。this的结构是个双向链表(这里不赘述了)。当调用ret 数组里面所保存函数的时候,会返回 i的值,过程是,首先编译器会先在函数fun1本身的环境寻找i这个值,显然i即不是成员变量也不是局部变量,所以没有找到,继续向上一层环境寻找(这里通过双向链表),结果发现getFuns函数环境中有i的值,但是这个时候i的值已经是10了;所以打印的结果都会是10;

 

例子2:

function getFuns()

         {

                   varret = new Array();

                   for(var i = 0 ;i < 10 ; i ++)

                   {

                            ret[i]= function(j){ ----------------->fun1

                               return function(){  ----------------->fun2

                                        return j;     

                                     };

                            }(i);-------------->调用自己.

                   }       

                   returnret;

         }       

         //

         varfuns = getFuns();

         funs[0]();//这里打印0;

         funs[1]();//这里打印1;以此类推

分析:由于,fun1编译时自动调用自己,fun2ret数组保存,所以,getFunsfun1, fun2三个函数的环境被保留下来。当调用ret 数组里面所保存函数的时候,会返回 j的值,过程是,首先编译器会先在函数fun2本身的环境寻找j这个值,显然j即不是成员变量也不是局部变量,所以没有找到,继续向上一层环境寻找(这里通过双向链表),结果发现fun1函数环境中有j的值,即返回了j的值。由于每个函数是个封闭的空间(说白了就是,内存地址不一样,每个函数都有自己的内存)。每个fun1函数的环境都保存了参数j(即 i )的值。所以,打印结果与例子1完全不同,即:0 1 2 3.....9;


以上为工作中一同事总结得出,如哪位大能还有其它见解,欢迎提出,大家共同学习

1 0
原创粉丝点击