javascript 闭包

本文详细探讨了JavaScript闭包的概念,通过实例解析了其保持数据状态的特性。闭包在函数间共享数据、保存状态方面发挥重要作用,但也可能导致内存泄露。文章列举了多个示例,包括参数引用、局部变量和函数自身保存数据的方式,展示了闭包的不同应用场景,并提醒开发者谨慎使用,避免不必要的内存消耗。最后,提到了手动删除对象属性以防止内存泄漏的实践方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天特地抽出时间又来研究了一次,我们的老朋友,闭包
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];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值