JavaScript 学习笔记七 闭包二
?
//获取内部变量的值 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());//defaultjson.setName("json"); alert(json.getName());//json//闭包问题 内存泄露//JavaScript 的解释器都具备垃圾回收机制,一般采用的是引用计数的形式,如果一个//对象的引用计数为零,则垃圾回收机制会将其回收,这个过程是自动的。//在闭包中,因为局部的变量可能在将来的某些时刻//需要被使用,因此垃圾回收机制不会处理这些被外部引用到的局部变量,而如果出现循环引//用,即对象 A 引用 B,B 引用 C,而 C 又引用到 A,这样的情况使得垃圾回收机制得出其//引用计数不为零的结论,从而造成内存泄漏