JavaScript内存释放和作用域销毁

JavaScript内存释放和作用域销毁

  • 堆内存

    我们知道,像对象这种引用数据类型,都是在栈区中存一个地址,然后指向堆区

    那么我们就不得不聊一个问题,它什么时候被销毁呢?难道堆区的空间一直开着吗?

    不会。

    规则是这样的:假如外面有变量引用了这个地址(即把这个地址值赋给了其它人),那么我们就说,有人用着这个值,它不能被销毁;除非没有人用了(这个值没有赋给任何人),那么 js 引擎会在空闲的时候把它销毁(垃圾回收)

    举例:

    let obj = {name: 'jack'}  //此时堆区中开辟了一块内存
    obj = null  //没人用堆区的这个对象了,此时这个对象在堆区中被销毁掉
    
  • 栈内存

    处于全局作用域的,都放在栈区中(先不考虑其它地方)

下面举几个经典的例子

function fn(){
    let num = 100
    return function(){
        
    }
}
let foo = fn  //fn不销毁
function fn(){
    let num = 100
    return function(){
        
    }
}
fn()  //fn执行完会销毁
function fn(){
    let num = 100
    return function(){
        
    }
}
fn()();  //fn不立即销毁,等到第二个括号执行完之后会销毁

注意:销毁了之后,它里面的东西也是不存在了的,比如 num 变量不会存在了,因为整个都已经销毁了

posted @ 2022-07-04 09:53  朱在春  阅读(78)  评论(0编辑  收藏  举报