美文网首页
JS内存释放

JS内存释放

作者: 空压机百科 | 来源:发表于2019-11-20 00:28 被阅读0次
    堆内存

    对象数据类型或者函数数据类型在定义的时候会开辟一个堆内存,堆内存有一个引用地址,如果外面变量知道了这个地址,我们就说这个内存被占用了,就不能销毁。
    堆内存释放 / 销毁:只需要把所有引用它的变量赋值赋值为null即可,如果当前的堆内存没有任何东西被占用了,那么浏览器会在空闲的时候把它销毁。

    栈内存

    1、全局作用域:只有当页面关闭的时候全局作用域才会销毁。
    2、基于ES6中的let / const形成的块作用域也是栈内存
    3、私有作用域(只有函数执行会产生私有的作用域):
    一般情况下,函数执行会形成一个新的私有作用域,当私有作用域中的代码执行完成后,我们当前作用域都会主动的进行释放和销毁。
    但是存在特殊情况下当前私有作用域中的部分内存被作用域以外的东西占用了,那么当前的这个作用域就不能销毁。
    a、函数执行返回了一个引用数据类型的值,并且在函数的外面被一个其他的东西给接受了,这种情况下一般形成的私有作用域都不会销毁。案例图:

    var num = 12;
    function fn(){
       var num = 120;
       return function(){
          console.log(num)
       }
    }
    var f = fn();
    f();
    

    解释:作用域A里面的堆内存 xxxfff111 被作用域A以外的 f 占用了,那么堆内存 xxxfff111 堆内存不能释放,对应的作用域A这个私有的作用域也不能销毁。>>里面的私有变量 num 也不能销毁了。
    b、在一个私有作用域中给 DOM 元素的事件绑定方法,一般情况下我们的私有作用域都不销毁。案例图:

    var div1 = document.getElementById("div1")
    !function (){
       div1.onclick = function(){
          
       }
    }.call()
    

    解释:通过 DOM 方法获取的元素 / 元素集合都是对象数据类型的值。
    c、下述情况属于不立即销毁,fn 返回函数没有被其他的东西占用,但是还需要执行一次,所以暂时不销毁,当返回的值执行完成后,浏览器会在空闲的时候把他销毁了。案例:

    function fn(){
       var num = 100;
       return function (){
          
       }
    }
    fn()();  // 首先执行 fn,返回一个小函数对应的内存地址,然后紧接着让返回的小函数在执行。
    

    内存销毁案例1:

    function fn(){
        var i = 10
        return function(n){
            console.log(n + (++i))
        }
    }
    var f = fn()
    f(10)
    f(20)
    fn()(10)
    fn()(20)
    

    内存销毁案例2:

    function fn(i){
        return function(n){
            console.log(n + i++)
        }
    }
    var f = fn(13)
    f(12)  // == 25
    f(14)  // == 28
    fn(15)(12)  // == 27
    fn(16)(13)  // == 29
    

    相关文章

      网友评论

          本文标题:JS内存释放

          本文链接:https://www.haomeiwen.com/subject/uywgictx.html