闭包的两个特点:www.goodsgy.com
1、作为一个函数变量的一个引用 - 当函数返回时,其处于激活状态。www.goodsgy.com
2、一个闭包就是当一个函数返回时,一个没有释放资源的栈区。www.goodsgy.com
例1。 www.goodsgy.com
<scripttype="text/javascript"> www.goodsgy.com
functionsayHello2(name){ www.goodsgy.com
vartext='Hello'+name;//localvariable www.goodsgy.com
varsayAlert=function(){alert(text);} www.goodsgy.com
returnsayAlert; www.goodsgy.com
} www.goodsgy.com
varsy=sayHello2('never-online'); www.goodsgy.com
sy(); www.goodsgy.com
</script>www.goodsgy.com
作为一个Javascript程序员,应该明白上面的代码就是一个函数的引用。如果你还不明白或者不清楚的话,请先了解一些基本的知识,我这里不再叙述。www.goodsgy.com
上面的代码为什么是一个闭包?www.goodsgy.com
因为sayHello2函数里有一个内嵌匿名函数www.goodsgy.com
sayAlert = function(){ alert(text); }www.goodsgy.com
在Javascript里。如果你创建了一个内嵌函数(如上例),也就是创建了一个闭包。www.goodsgy.com
在C或者其它的主流语言中,当一个函数返回后,所有的局部变量将不可访问,因为它们所在的栈已经被消毁。但在Javascript里,如果你声明了一个内嵌函数,局部变量将在函数返回后依然可访问。比如上例中的变量sy,就是引用内嵌函数中的匿名函数function(){ alert(text); },可以把上例改成这样: www.goodsgy.com
<scripttype="text/javascript"> www.goodsgy.com
functionsayHello2(name){ www.goodsgy.com
vartext='Hello'+name;//localvariable www.goodsgy.com
varsayAlert=function(){alert(text);} www.goodsgy.com
returnsayAlert; www.goodsgy.com
} www.goodsgy.com
varsy=sayHello2('never-online'); www.goodsgy.com
alert(sy.toString()); www.goodsgy.com
</script>www.goodsgy.com
这里也就与闭包的第二个特点相吻合。www.goodsgy.com
例2。 www.goodsgy.com
<scripttype="text/javascript"> www.goodsgy.com
functionsay667(){ www.goodsgy.com
//Localvariablethatendsupwithinclosure www.goodsgy.com
varnum=666; www.goodsgy.com
varsayAlert=function(){alert(num);} www.goodsgy.com
num++; www.goodsgy.com
returnsayAlert; www.goodsgy.com
} www.goodsgy.com
varsy=say667(); www.goodsgy.com
sy(); www.goodsgy.com
alert(sy.toString()); www.goodsgy.com
</script>www.goodsgy.com
上面的代码中,匿名变量function() { alert(num); }中的num,并不是被拷贝,而是继续引用外函数定义的局部变量——num中的值,直到外函数say667()返回。www.goodsgy.com
[1] [2] [3] 下一页