JS具有自动垃圾收集机制;也就是说,执行环境会管理代码执行过程中使用的内存。
一、局部变量的生命周期
局部变量只在函数执行过程中存在。
在这个过程中,会为局部变量在栈(或堆)内存上分配相应的空间,以便存储它们的值。然后在函数中使用这些变量,直到函数执行结束;然后释放内存。
二、标记清除
当变量进入环境,就将这个变量标记为“进入环境”;从逻辑上讲,永远不能释放进入环境的变量所占的内存;当变量离开环境时,则将其标记为“离开环境”。
三、管理内存
为执行环境中的代码保存必要的数据;一旦数据不再有用,最好通过将其设置为null,来释放其引用——这个做法叫做解除引用;这个方法适用于大多数全局变量和全局对象的属性。局部变量会在它们离开执行环境时自动解除引用。
解除一个值的引用并不意味着自动回收该值所占的内存;解除引用的真正作用在于,让值脱离执行环境,以便垃圾收集器下次运行时将其收回。
四、闭包与垃圾回收
作用域链是一个对象列表,不是绑定的栈;
每次调用JS函数的时候,都会为之创建一个新的对象来保存局部变量,谓之“变量对象”;把这个对象添加到作用域链中,当函数返回的时候,就从作用域链中将这个变量对象删除。
如果不存在嵌套的函数,也没有其他引用指向这个变量对象,它就会被当做垃圾回收掉。
如果定义了嵌套的函数,每个嵌套的函数都各自对应一条作用域链,并且这个作用域链指向一个变量对象。
如果这些嵌套函数对象在外部函数中保存下来,那么它们也会和所指向的变量对象一样当做垃圾回收。
但是如果这个函数定义了嵌套的函数,并将它作为值返回或者存储在某处的属性里,这时就会有一个外部引用指向这个嵌套的函数,它就不会被当做垃圾回收,并且他所指向的变量对象也不会被当做垃圾回收。
时间: 2024-11-08 03:50:47