日期:2014-05-16  浏览次数:20286 次

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());//default
json.setName("json"); alert(json.getName());//json
1 楼 sblig 2012-04-28  
最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
2 楼 sblig 2012-04-28  
//闭包问题  内存泄露
//JavaScript 的解释器都具备垃圾回收机制,一般采用的是引用计数的形式,如果一个
//对象的引用计数为零,则垃圾回收机制会将其回收,这个过程是自动的。

//在闭包中,因为局部的变量可能在将来的某些时刻
//需要被使用,因此垃圾回收机制不会处理这些被外部引用到的局部变量,而如果出现循环引
//用,即对象 A 引用 B,B 引用 C,而 C 又引用到 A,这样的情况使得垃圾回收机制得出其
//引用计数不为零的结论,从而造成内存泄漏