闭包学习之我的理解
学习资料
http://abruzzi.iteye.com/blog/658473
<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; } } };})();