日期:2014-05-16 浏览次数:20317 次
?
//获取内部变量的值 f2为闭包 function f1(){ var n = 999; function f2(){ return n; } return f2; } var result = f1(); alert(result()); //闭包用途 UI初始化 var datamodel = { table : [], tree : {} }; (function(dm){ for(var i=0;i<dm.table.rows; i++){ var row = dm.table.rows[i]; for(var j=0;j<row.cells; j++){ drawCell(i,j); } } })(datamodel); //们创建了一个匿名的函数,并立即执行它,由于外部无法引用它内部的变量 //执行完后很快就会被释放,关键是这种机制不会污染全局对象 //闭包用途 缓存数据 var CachedSearchBox = (function(){ var cache = {}; return{ attachSearchBox : function(dsid){ if (dsid in cache){//如果结果在缓存中 alert("获取缓存中的值"); return cache[dsid]; } alert("新建的值"); var fsb = new Array("one","two","11","14","13","11","13","12");//新建 cache[dsid] = fsb;//更新缓存 return fsb; }, clearSearchBox : function(dsid){ if( dsid in cache){ delete cache[dsid]; } } }; })(); alert(CachedSearchBox.attachSearchBox("input1"));//新建的值 alert(CachedSearchBox.attachSearchBox("input1"));//获取缓存中的值 CachedSearchBox.clearSearchBox("input1");//清除 alert(CachedSearchBox.attachSearchBox("input1"));//新建的值 alert(CachedSearchBox.attachSearchBox("input1"));//获取缓存中的值
// 闭包用途 数据封装 对象 function Person(){ var names = "default"; return { getName : function(){ return names; }, setName : function(newname){ names = newname; } } }; //alert(names); 直接报错 names 未定义 var json = Person(); alert(json.getName());//default json.setName("json"); alert(json.getName());//json
//闭包问题 内存泄露 //JavaScript 的解释器都具备垃圾回收机制,一般采用的是引用计数的形式,如果一个 //对象的引用计数为零,则垃圾回收机制会将其回收,这个过程是自动的。 //在闭包中,因为局部的变量可能在将来的某些时刻 //需要被使用,因此垃圾回收机制不会处理这些被外部引用到的局部变量,而如果出现循环引 //用,即对象 A 引用 B,B 引用 C,而 C 又引用到 A,这样的情况使得垃圾回收机制得出其 //引用计数不为零的结论,从而造成内存泄漏