关于闭包的详细解析:
例子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;
分析:由于,fun1被ret数组保存,所以,getFuns,fun1两个函数的环境被保留下来。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编译时自动调用自己,fun2被ret数组保存,所以,getFuns,fun1, fun2三个函数的环境被保留下来。当调用ret 数组里面所保存函数的时候,会返回 j的值,过程是,首先编译器会先在函数fun2本身的环境寻找j这个值,显然j即不是成员变量也不是局部变量,所以没有找到,继续向上一层环境寻找(这里通过双向链表),结果发现fun1函数环境中有j的值,即返回了j的值。由于每个函数是个封闭的空间(说白了就是,内存地址不一样,每个函数都有自己的内存)。每个fun1函数的环境都保存了参数j(即 i )的值。所以,打印结果与例子1完全不同,即:0 1 2 3.....9;
以上为工作中一同事总结得出,如哪位大能还有其它见解,欢迎提出,大家共同学习