JS (八) 閉包
//獲取內部變數的值 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")); //獲取快取中的值
[js] view plain copy
// 閉包用途 資料封裝 物件
function Person() {
var names = "default";
return {
getName: function() {
return names;
},
setName: function(newname) {
names = newname;
}
}
};
//alert(names); 直接ames 未定義報錯 n
var json = Person();
alert(json.getName()); //default
json.setName("json");
alert(json.getName()); //json