闭包只能取得包含函数中的任何变量的最后一个值,所以尽量把值放在自己的局部变量里面,
这样可以提高数据的搜索性能,避免作用域查找
看例子:
function cFunction(){
var result = new Array();
for (var i=0; i<10; i++){
result[i] = function(){
return i;
}
}
return result;
}
var funs = cFunction();//这个时候funs是一个数组,里面放得是函数的引用,指向10个不同的函数。
for(var i=0; i<funs.length; i++){
document.write(funs[i]() + "<br />");
}这里打印出10个10,因为当你调用10个匿名函数时,它需要返回i,但是它本身不包含i,所以它要
向上级作用域需找,这个时候cFunction里面的i值已经是10,所以打印出来10个10.
解决方法,就是将值直接保存在自己的局部变量里面,例子:
function cFunction(){
var result = new Array();
for (var i=0; i<10; i++){
result[i] = function(num){
return function(){
return num;
};
}(i);
}
return result;
}
var funs = cFunction();//这个时候funs是一个数组,里面放得也是函数的引用,指向10个不同的函数。
for(var i=0; i<funs.length; i++){
document.write(funs[i]() + "<br />");
}//这里会输出0~9,因为每个匿名函数要返回num,它本身的作用域里面没有,就会向上寻找,上级的匿名函数里面是
包含num的,而num的值刚好就是0~9,所以拿到的就是0~9.所以建议闭包中也尽量把数据保存在自己作用域的局部变量中。