javascript 杂项 闭包 内存泄漏 内存溢出


prtyaa
prtyaa 2023-12-26 18:45:14 50843
分类专栏: 资讯

一、闭包:

如下就是一个闭包程序:

counter 里面 函数add 调用外部变量,此时就会产生闭包。

 

function counter(){
             var counter=0;
             function add(){
                 return "当前的人数:"+(++counter);
             }
             return add;

         }
       var login_counter=counter(); //闭包导致add()会留在内存  login_counter指向add方法,内存回收只能使用login_counter=null
       console.log(login_counter());
       console.log(login_counter());
       console.log(login_counter());
       login_counter=null  //add函数不在有变量指向,变成垃圾对象竟会被回收

返回结果:

闭包的作用:

1、使函数内部变量在函数执行完成后仍然存活于内存中(延长了局部变量的生命周期)

2、让函数外部变量可以操作(读写)到函数内部的数据(变量/函数)

闭包的生命周期:

产生:在嵌套内函数定义执行完成时就已经产生(并不是在闭包函数调用是才产生,函数定义的时候就已经产生)

死亡:嵌套的函数成为垃圾对象时

二、闭包的应用:

闭包的应用主要用在JS模块中:

如下所示 mymode1.js 中定义了一个模块:

function mymod1(){
var counter=0;
function Login(){
return ++counter;
}
function Quit(){
return --counter;
}

return {
Login:Login,
Quit:Quit
}

}

调用如下:

<script src="mymode1.js"></script>
<script>
    var module=mymod1();
    console.log(module);
    console.log(module.Login());
    console.log(module.Login());
    console.log(module.Login());
    console.log(module.Login());
    console.log(module.Quit()); 
    module=null; //释放内存
</script>

 

另外一种更加流行的写法mymode2.js:

(function(window){
    var counter=0;
    function Login(){
        return ++counter;
    }
    function Quit(){
        return --counter;
    }
    
    window.mymod2={
        Login:Login,
        Quit:Quit
    };
    
})(window)

调用更简洁:

<script src="mymode2.js"></script>
<script> 
 console.log(mymod2.Login());
 console.log(mymod2.Login());
 console.log(mymod2.Login());
 console.log(mymod2.Login());
 console.log(mymod2.Quit());  
 mymod2=null;//释放内存
</script>
</script>

三、内存泄漏和内存溢出

内存泄漏:变量无用后还在内存中就会造成内存泄露,大部分不会造成程序崩溃,但是大量的内存泄漏会造成可供程序分配的内存越来越小。进而导致内存溢出报错

例如 变量a 没有在函数内申明 a 将会导致a成为全局变量常驻内存,导致内存泄漏(意外的全局变量):

 function fn(){
     a=1;
     console.log(a);
 }
 fn();

闭包也会造成内存泄漏:

 function fn(){
     var a=new Array(100000);
     function test(){
         console.log(a);
     }
     return test;
 }
 var t=fn();

//t 没有设置成NULL 那么a数组常驻内存 造成内存泄漏

定时器使用不当,没有及时清理也会造成内存泄漏

内存溢出:当程序运行需要的内存超过了可供程序分配的内存时,就会造成内存溢出

<script>
    var obj={};
for(var i=0;i<10000;i++){
    obj[i]=new Array(100000);
}
//大量空数组造成内存溢出,浏览器直接崩溃
</script>

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=31041
赞同 0
评论 0 条
prtyaaL2
粉丝 1 发表 2553 + 关注 私信
上周热门
如何使用 StarRocks 管理和优化数据湖中的数据?  2935
【软件正版化】软件正版化工作要点  2854
统信UOS试玩黑神话:悟空  2811
信刻光盘安全隔离与信息交换系统  2702
镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态  1235
grub引导程序无法找到指定设备和分区  1205
点击报名 | 京东2025校招进校行程预告  162
华为全联接大会2024丨软通动力分论坛精彩议程抢先看!  160
2024海洋能源产业融合发展论坛暨博览会同期活动-海洋能源与数字化智能化论坛成功举办  157
华为纯血鸿蒙正式版9月底见!但Mate 70的内情还得接着挖...  154
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

加入交流群

请使用微信扫一扫!