美文网首页程序员让前端飞
javascript的预解释-作用域-内存的释放

javascript的预解释-作用域-内存的释放

作者: 知识搬运工horace | 来源:发表于2017-09-06 19:18 被阅读0次

    作用域链:
    当函数被调用的时候,会形成一个私有作用域,看私有作用域中,是否存在私有变量A:
    1)如果有私有变量A:那么整个作用域中的A,跟外界没有任何关系;所有该作用域中的A,都是私有变量;
    2)如果没有私有变量A:就会往上级作用域进行查找,找到的话,直接用,找不到继续找,一直找到window还没有,就会报错!;
    私有变量有两种:
    ①当前作用域下带var的;
    ②形参;

    堆内存的释放

    对象数据类型或者函数数据类型在[定义]的时候首先都会开辟一个堆内存,堆内存又有一个引用的地址,如果外面有变量等知道了这个地址,我们就说这个内存被占用了,就不能销毁了。
    "var obj1 = {};
    var obj2 = obj1;"
    我们想要让堆内存释放/销毁,只需要把所有引用它的变量值赋值为null就可以,如果当前的堆内存没有任何东西被占用了,那么浏览器会在空闲的时候把它销毁...(也叫垃圾回收)
    "obj1 = null;
    obj2 = null;"

    栈内存

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

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

    }
    fn();" 这个函数是销毁。
    function fn(){
    var num=1000;
    return function(){
    }
    }
    var f=fn(); //fn执行形成的这个私有作用域就不在销毁了。

    "function fn() {
    var num=100;
    return 10;
    }
    var f=fn();" //私有作用域就可以销毁了

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

    };
    

    }
    fn()();
    /这种情况属于不立即销毁-->fn返回的函数没有被其他的东西占用,但是还需要执行一次在被销毁。

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

    var oDiv = document.getElementById("div1");

    !function (){
        oDiv.onclick =function(){
    
        }
    }();//当前自执行函数形成的这个私有作用域也是不可以销毁 
    

    总结

    函数能被销毁的情况:
    1函数最后的值是一个值,不再调用此函数了,就可以被销毁。
    不能被销毁的情况:
    1函数里有全局变量。
    2函数有事件发生,不能被销毁,
    3函数最后的值还是函数,不能被销毁。

    相关文章

      网友评论

        本文标题:javascript的预解释-作用域-内存的释放

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