zoukankan      html  css  js  c++  java
  • JS_闭包和内存.

    function main(){
        var str = new Array(1000).join(new Array(5000).join("xxxxx"));
        return function(){
            var arr = [];
            arr.push(str);
            }
        }            //这里内存无异常  用sIEve 显示为 19000+
    var other = main();    //这里内存开始一场 显示为 68000+
    other = null;       //这里内存还原 显示为19000+
    (function(){
        var str = new Array(1000).join(new Array(5000).join("xxxxx"));
        document.getElementById("add").onclick = function(){
            var arr = [];
            arr.push(str);
            }          //这里内存就就异常了 显示 68000+
      document.getElementById("add").onclick = null; //这里显示为正常 19000+ })();
    /*
    * 要写在不同环境中内存才能正确的被释放.
    */
    (function(){ var str = new Array(1000).join(new Array(5000).join("xxxxx")); var add = document.getElementById("add"); add.onclick = function(){ var arr = []; arr.push(str); } })(); (function(){ var det = document.getElementById("det"),add = document.getElementById("add"); det.onclick = function(){ add.onclick = null; } })();
    /*
    * 2012.12.26
    * 对于内存回收,在函数中的局部变量在函数结束的时候会被垃圾回收机制回收内存, 全部变量是否就是不在函数内的变量呢, 比如,下面的变量A,当然还有页面内的各种元素.
    * 由于变量A是个全局变量,所以他所占的内存是不会被施放的,也就解释了为什么函数main中的变量str所占的内存没有被回收,如果按照写法二,是不会出现内存问题的.
    * 一个函数既是一个环境,最大的环境是window,内存的回收是按照一个环境一个环境来施放的.[当这个环境中,全局变量所有的引用都断开的话,此环境就会被施放内存];
    */
    function
    main(){ var str = new Array(1000).join(new Array(5000).join("xxxxx")); return function(){ var arr = []; arr.push(str); str = null }; }
    var a = main(); 
      a();

    写法二:
    ~function(){
      var a = main();
      a();

    }()
    /*
    * 2013.1.6 变量arg2被引用,arg1没被引用,所以arg1所占的内存还是会被回收;
    * 结论; 局部变量只有被全局变量所引用内存才不会施放.不然还是回被垃圾回收机制回收内存.
    */
    var
    add = document.getElementById('add'); var det = document.getElementById('det'); function main(){ var arg1 = new Array(1000).join(new Array(5000).join("xxxxx")); var arg2 = 2; gg = function(){ arg2++; } return function(){ alert(arg2); gg(); } } var aa = main(); gg(); add.onclick = function(){ aa(); }

     2013.2.16

    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    这句会导致sIEve-0.0.8.exe内存无法被正确施放.

     

    /*
    * 这里的内存要清除,需要断开两个事件引用.或者强制把局部变量 str = null; 清空!!
    */
    (function(){ var str = new Array(1000).join(new Array(5000).join("xxxxx")); var det = $("#det"),add = $("#add"); add.bind("click",function(){ var arr = []; arr.push(str); }); det.bind("click",function(){ add.unbind("click"); det.unbind("click"); }); })();

     2013.2.27 分离写法;虽然麻烦但是调理清晰;

    var demo = $.Class.creat();
    demo.prototype = {
        init:function(){
            this.opat = {
                add:null,
                det:null
                };
            $.Object.extend(this.opat,arguments[0]||{});
            this.fire();
        },
        fire:function(){
            var _this = this, _opat = _this.opat;
            var add = _this.add = $(_opat.add);
            var det = _this.det = $(_opat.det);
            _this.bind_add();
            _this.bind_det();
        },
        bind_add:function(){
            var _this = this, _opat = _this.opat;
            var add = _this.add;
            var str = new Array(1000).join(new Array(5000).join("xxxxx"));
            add.bind("click",function(){
                var arr = [];
                arr.push(str);
            });
        },
        bind_det:function(){
            var _this = this, _opat = _this.opat;
            var add = _this.add;
            var det = _this.det;
            det.bind("click",function(){
                add.unbind("click");
            });
        }
    }
    new demo({
        add:"#add",
        det:"#det"
    })

     

     

  • 相关阅读:
    [HDU3555]Bomb
    [POJ3096]Surprising Strings
    [POJ1068]Parencodings
    [POJ3295]Tautology
    [POJ2586]Y2K Accounting Bug
    [POJ2109]Power of Cryptography
    [POJ1328]Radar Installation
    Binary search tree system and method
    ES6详解八:模块(Module)!--各种导入导出方法
    java在cmd下编译和执行引用jar的类
  • 原文地址:https://www.cnblogs.com/somesayss/p/2745497.html
Copyright © 2011-2022 走看看