在Javascript中,什么是闭包(Closure)
2010-09-14 13:30:07 来源:WEB开发网如果理解以上代码后,看下面的例子:
例4。
<scripttype="text/javascript">
functionbuildList(list){
varresult=[];
for(vari=0;i<list.length;i++){
varitem='item'+list[i];
result.push(function(){alert(item+''+list[i])});
}
returnresult;
}
functiontestList(){
varfnlist=buildList([1,2,3]);
//usingjonlytohelppreventconfusion-couldusei
for(varj=0;j<fnlist.length;j++){
fnlist[j]();
}
}
testList();
</script>
运行结果:
item3isundefined
item3isundefined
item3isundefined
代码result.push(function(){alert(item+''+list[i])}),
使result数组添加了三个匿名函数的引用。这句代码也可以写成
varp=function(){alert(item+''+list[i])};
result.push(p);
关于为什么会输出三次都是 "item 3 is undefined"
在上面的例子say667()例子中已经解释过了。
匿名函数function() {alert(item + ' ' + list[i])}中的list[i]并不是经过拷贝,而是对参数list的一个引用。直到函数buildList()返回为止,也就是说,返回最后一个引用。即遍历完list(注:list的最大下标应该是2)后,经过i++也就变成了3,这也就是为什么是item 3,而list[3]本身是没有初始化的,自然也就是undefined了。
例5。
<scripttype="text/javascript">
functionnewClosure(someNum,someRef){
//Localvariablesthatendupwithinclosure
varnum=someNum;
varanArray=[1,2,3];
varref=someRef;
returnfunction(x){
num+=x;
anArray.push(num);
alert('num:'+num+
'nanArray'+anArray.toString()+
'nref.someVar'+ref.someVar);
}
}
varclosure1=newClosure(40,{someVar:'never-online'})
varclosure2=newClosure(99,{someVar:'BlueDestiny'})
closure1(4)
closure2(3)
</script>
在这最后一个例子中,展示如何声明两个不同的闭包。
Tags:Javascript 什么 闭包
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接