//获取内部变量的值 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