1. 程式人生 > >JS (八) 閉包

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