论闭包与垃圾回收机制的关系

    技术2024-10-10  54

    首先我们先来谈谈js中的内存

    在js中,垃圾回收机制是针对的内存,什么样的数据是没用的数据,没用的数据将会被销毁,销毁的是哪里的数据。

    内存分栈和堆,栈是系统创建,堆是程序员自己创建,若不能合理使用内存,就会导致内存泄漏。

    再来谈谈内存的声明周期:

    ​ 1.分配你所需要的内存,也就是分配空间

    ​ 2.使用配置你所需要的内存(读,写)

    ​ 3.不需要时,将其释放(所谓的垃圾回收机制)

    再说说内存分配

    首先是系统自分配,js在定义变量时就自动完成了分配。例:

    var n=123;// 栈会给数值变量分配空间 用来存123 var str='123';//栈 给str 变量 分配空间 用来存字符串 '123' // 栈给 o 变量分配空间 存指针。 // 堆来存对象数据 // 栈给对象下属性name分配空间 用来存字符串'周超' var o={ name:'周超' } // 给数据及其元素分配空间 // 栈给arr存指针 栈存元素 堆创建空间存数组;提供指针 var arr=[1,2,3]; // 给函数(可调用的对象)分配内存 // 栈 foo 存指针 堆存函数提供指针 // 函数调用 栈存返回值 (【返回值】长时间没被变量引用,计算机销毁) function foo(a){ return a+2 }

    还有就是函数调用分配空间

    // 有些函数通过调用来对象分配 var date=new Date();//date 通过调用Date() 函数给日期对象分配空间; var str='dafrssedeb'; var subStr=str.substr(0,4);//dafr subStr一个新的字符串 // 使用值 // 写:往内存中写入变量或对象下属性,并赋值 // 读:读的是内存中存的数据

    看完上面,我们来看看垃圾回收机制。

    垃圾回收机制

    // 引用 // 分类:显示引用 隐士引用 // 显示引用:一个对象访问另一个对象下属性 // ---->又被叫做一个对象引用另一个对象 // 隐士引用:一个对象,通过原型对象访问的属性 // 对象指的是:GO AO 函数对象 普通对象 // 引用计数垃圾收集 // ---->关键看,一个对象是否被其他变量所引用(使用) // 零引用的对象:被垃圾回收机制所回收 var o={ a:{ b:2 } } // 两个对象,一个key为a 一个key为b // 两个对象被创建,一个作为另一个的属性被引用,另一个被分配给变量o // 很显然,没有一个可以被垃圾收集 var o2 = o; // o2变量是第二个对“这个对象”的引用 引用了key为a的对象 o = 1; // 现在,“这个对象”只有一个o2变量的引用了,“这个对象”的原始引用o已经没有 var oa = o2.a; // 引用“这个对象”的a属性 key为b的对象 // 现在,“这个对象”有两个引用了,一个是o2,一个是oa o2 = "yo"; // 虽然最初的对象现在已经是零引用了,可以被垃圾回收了 // 但是它的属性a的对象还在被oa引用,所以还不能回收 oa = null; // a属性的那个对象现在也是零引用了 // 它可以被垃圾回收了 // 总结:代码从头执行到尾部,如果说这个对象,以及对象中属性,没有被任何全局变量所引用(直接或间接)那么对象就会被回收

    最后,闭包与垃圾回收机制

    标记清除算法

    function foo(){ var a=0; return function(){ console.log(++a); } } var res=foo();//因为res引用了return返回的函数 所以ao被引用,不可以被回收 res(); // 找到不用的条件后清空 // 当闭包完成任务后,找到完成任务的条件,然后清空res,那么foo的AO对象就不会再被引用,所以实现了清空闭包缓存 res=null; //二 foo()();//因为没有任何变量和属性引用返回的函数,所以也可以回收
    Processed: 0.012, SQL: 11