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
 

猜你喜欢

转载自blog.csdn.net/bujiongdan/article/details/83185543