学习资料
[url]http://abruzzi.iteye.com/blog/658473[/url]
[url]http://abruzzi.iteye.com/blog/658473[/url]
<html>
<head>
<title></title>
</head>
<body>
<div>demo</div>
<button id="xxxt" onclick="xx()">toggle</button>
</body>
</html>
<script language="javascript" type="text/javascript">
/**
如下例,内部函数引用外部函数的变量(这里是变量i)
该内部函数即形成闭包,"闭"是指内部函数中的变量对于外部不可见(而内部函数可以引用外部变量)
思考:照此理解,我们应该经常在不知不觉中使用着闭包,只要我们在客户端环境下定义一个函数,而
该函数引用了全局变量,那么这不就是一个闭包?因为该函数和全局变量是属于windows这个顶级对象的
*/
var arr=[];
var def=function (){
for(i=0;i<3;i++){
arr.push({
'id':i,
'getIndex':function (){
return ("第"+i+"个元素");
}
});
}
}
def();
/*
注意运行结果,闭包里变量的值并不是创建时的值,而是外部函数中该变量最后的值
(只是创建了一个' return ("第"+i+"个元素"); '的函数体)
*/
alert(arr[0].id+":"+arr[0].getIndex());//0:第3个元素
alert(arr[1].id+":"+arr[1].getIndex());//1:第3个元素
alert(arr[2].id+":"+arr[2].getIndex());//2:第3个元素
/**
闭包的用途
1 减少全局变量,避免污染
2 记忆数据状态
*/
var counter=(function (){
var cache={};//使用闭包和匿名自执行函数,将该变量封装起来,减少全局变量污染,而且"记忆"内部函数函数的运算结果
return {
'count':function (n){
if(cache.n&&cache.n==n){
alert('取得是缓存值');
return cache['result'];
}else{
var v= n*n;
cache.n=n;
cache.result=v;
return v;
}
}
};
})();