关于闭包和变量的作用域的问题

来源:互联网 发布:阿克苏新站怎么做优化 编辑:程序博客网 时间:2024/06/09 13:45

闭包只能取得包含函数中的任何变量的最后一个值,所以尽量把值放在自己的局部变量里面,

这样可以提高数据的搜索性能,避免作用域查找

看例子:

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.所以建议闭包中也尽量把数据保存在自己作用域的局部变量中。