WEB开发网
开发学院网页设计JavaScript 在Javascript中,什么是闭包(Closure) 阅读

在Javascript中,什么是闭包(Closure)

 2010-09-14 13:30:07 来源:WEB开发网   
核心提示: 如果理解以上代码后,看下面的例子:例4,在Javascript中,什么是闭包(Closure)(3), <scripttype="text/javascript">functionbuildList(list){varresult=[];for(vari=0

如果理解以上代码后,看下面的例子:

例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>

在这最后一个例子中,展示如何声明两个不同的闭包。

上一页  1 2 3 

Tags:Javascript 什么 闭包

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接