javascript 闭包

今天特地抽出时间又来研究了一次,我们的老朋友,闭包
js 闭包最主要的特性,就是能够保持包含它的函数的数据状态,导致这种特性原因正是引用

我对闭包的理解:子函数,用了父函数的东西,儿子将父亲的东西据为己有,且还需要父亲一直陪着,(儿子就是任性)

//例子1:


var obj = {};
for(var i =0;i < 2;i++){
    obj[i] = function(){
        alert(i);
    };
}
//上述for循环中的两个闭包,都指向了全局的[i]
obj[0]();  //2
obj[1]();  //2

//例子2:

var obj = {};
for(var i =0;i < 2;i++){
    obj[i] = function(ii){   //闭包1
        return function(){ //闭包2
            alert(ii);   
        }
    }(i);
}
obj[0]();  //0
obj[1]();  //1

//例子2,闭包2引用了闭包1 的参数,因此闭包1的数据状态会一直被保持,这正是闭包的特性
//例子2是参数引用触发的闭包特性,我们还可以用局部变量来保持数据,看下面的例子3

//例子3


var obj = {};
for(var i =0;i < 2;i++){
    (function(){         //闭包1
        var ii = i;       //局部变(是关键)
        obj[i] = function(){    //闭包2
            alert(ii)
        }
    })();
}
obj[0]();  //0
obj[1]();  //1

//例子4,我们还可以让函数自己去保存数据

var obj = {};
for(var i =0;i < 2;i++){
    (obj[i] = function(){
        alert(arguments.callee.value);
    }).value = i;
}
obj[0]();  //0
obj[1]();  //1

在闭包特性给我们带来方便的同时,我们因该理性的酌情使用,不要乱用,避免内存泄露,
如上述例子2,3中,如果obj这个对象,一直存在全局变量中,没有销毁的机会,就有可能造成内存泄露 特别在服务器端
为了避免这样的现象,我们可能还需要手动的
delete obj[0];
delete obj[1];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值