function t1(){
var age=20;
function t2(){
alert(age);
}
}
var tmp=t1();
在大部分的语言中,t1被调用执行,则申请内存并把其局部变量,push入栈!t1函数执行完毕,内部的局部变量,随着函数的退出而销毁,因此age=20的局部变量也将消失。
但是在js中,age=20这个变量,却被t2捕捉,即使t1执行完毕,通过t2
var age=99;
tmp();//20
这种情况---返回的函数,并非孤立的函数,甚至把其周围的环境变量,形成了一个封闭的环境包,共同返回,所以叫做闭包
看下面的例子:
function closure(){
var sister='大桃花';
var mysister=function(){
return sister;
}
return mysister;//这个函数出生时,有一个叫大桃花的姐姐
}
function place(){
var sister='大福晋';
var mysister=closure():
alert(mysister());
}
place();//大桃花
使用闭包做一个全局的计数器
var cnt=(function(){
var cnt=0;
return function(){
return ++cnt;
}
})();//表示cnt为一个立即执行的函数
alert(cnt());
alert(cnt());
/*
在工作中,一般如何避免全局污染或冲突
1.统一放在一个全局对象上,如JQUERY->$
2.每人用自己的命名空间
var chen={}
chen.cnt=(function(){
var cnt=0;
return function(){
return ++cnt;
}
*/
还有比较有意思的一个现象
for(var i=0,lis=document.getElementsByTagName('li'),len=lis.length;i<len;i++){
lis[i].οnclick=function(){
alert(i);
}
}
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
值都为4