美文网首页
内存释放

内存释放

作者: 阿九是只大胖喵 | 来源:发表于2017-02-26 21:34 被阅读0次

堆内存
对象数据类型,或者函数数据类型,在定义的时候,首先都会开辟一个堆内存,堆内存有一个引用地址,如果外面有变量知道了并引用这个地址,我们就说这个内存被占用了,就不能被销毁了。

    var obj1 = {
        name: 'zhangsan'
    };
    var obj2 = obj1;

想要堆内存释放/销毁,只需要把所有引用它的变量值赋值为null即可,如果当前的堆内存没有任何东西被占用了,那么浏览器会在空闲的时候把它销毁。

    obj1 = null;
    obj2 = null;
分析图.png

栈内存
全局作用域:只有当页面关闭的时候,全局作用域才能被销毁。

私有作用域(只有函数执行会产生私有作用域)
一般情况下函数执行会形成一个新的私有作用域,当私有作用域中的代码执行完成后,当前作用域都会进行主动的释放和销毁。
但是还是存在特殊的情况:当前私有作用域的部分内容被作用域以外的东西都占用了,那么当前的这个作用域就不能被销毁了。

a. 函数执行返回了一个引用数据类型的值,并且在函数的外面被一个其他的东西接收了,这种情况下一般形成的私有作用域都不会被销毁。

    function fn() {
        var num = 100;
        return function () {
            num++;
            console.log(num);
        }
    }
    var f = fn(); // fn执行形成的这个私有作用域就不能被销毁了

b. 在一个私有的作用域中,给DOM元素元素的事件绑定方法,一般情况下私有作用域都不销毁。

    var oDiv = document.getElementById('div1');
    ~function () {
        oDiv.onclick = function () {

        }
    }(); // 当前自执行函数形成的这个私有的作用域也不销毁
分析图.png

c. 下述情况属于不立即销毁 -> fn返回的函数没有被其他的东西占用,但是还需要执行一次,所以暂时不销毁,当返回的值执行完成后,浏览器会在空闲的时候将其销毁,称之为"不立即销毁"。

    function fn() {
        var num = 100;
        return function () {

        }
    }
    fn()(); // 首先执行fn,返回一个小函数对应的内存地址,然后紧接着让返回的小函数再执行

一道面试题:

    function fn() {
        var i = 10;
        return function (n) {
            console.log(n + (++i));
        }
    }
    var f = fn();
    f(10);   // 21
    f(20);   // 32
    fn()(10); // 21
    fn()(20); // 31
分析图.png
    function fn(i) {
        return function (n) {
            console.log(n + (++i));
        }
    }
    var f = fn(13);
    f(12);   // 26
    f(14);   // 29
    fn(15)(12); // 28
    fn(16)(23); // 40

相关文章

  • 十一、闭包(堆栈内存释放问题)------ 2020-04-05

    1、堆内存释放问题: 2、栈内存释放问题:

  • kkbox-ios-dev笔记(三) - 内存管理/代理

    内存管理(一) 内存泄漏:该释放的对象, 没有被释放(已经不再使用的对象, 没有被释放)无效内存引用:内存已经被释...

  • malloc,free底层实现

    设想:内存碎片:由于malloc在内存中连续sbrk申请内存,而释放内存只能从后往前释放。为了达到可以先释放前面申...

  • 链接收藏

    iOS面试题 野指针 使用了释放的内存 内存泄漏 内存没有释放

  • free()后内存不释放问题 - 内存缓冲池技术

    free()后内存不释放问题 - 内存缓冲池技术 free()后内存不释放问题 - 内存缓冲池技术

  • 内存泄漏 Instruments Leak使用

    内存泄漏就是应该释放而没有释放的内存! 内存溢出 out of memory:是指程序在申请内存时,没有足够的内存...

  • (1) SGI的Allocator分析

    C++标准的内存配置和释放动作: 在sgi STL中:内存配置--> alloc::allocator()内存释放...

  • 内存释放

    让对象等于 null (空对象指针),可以不占用堆内存,堆内存不被变量占用时,可以释放(浏览器在它空闲的时候回收)...

  • 内存释放

    堆内存对象数据类型,或者函数数据类型,在定义的时候,首先都会开辟一个堆内存,堆内存有一个引用地址,如果外面有变量知...

  • Ubuntu日常操作手册

    lv文件系统动态扩容 手动释放内存,注意此操作会清空内存数据 关于释放内存详细描述见此文章:ubuntu 手动释放...

网友评论

      本文标题:内存释放

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