闭包

作者: 开心的小哈 | 来源:发表于2018-12-25 11:09 被阅读0次

    概念

    当内部函数被保存到外部时,将会生成闭包.闭包会导致原有的作用域链不释放造成内存泄漏.
    什么是泄露比如手中的撒子,会慢慢的溜出去,剩余的越少,少的就是内存,溜出去的就是占用

    闭包的作用

    实现公有的变量
    eg:函数累加器:

    function add(){
                var cont=0;
                function dd(){
                    cont++;
                    document.write(cont);
                }
                return dd;
            }
            var demo=add();
            demo();
            demo();
            demo();
            demo();
    

    可以做缓存(存储结构)

    function test(){
                var num=100;
                function a(){
                    num++;
                    document.write(num);
                }
                    
                function b(){
                    num --;
                    document.write(num);
                }
                return [a,b];
            }
            var myArr=test();
            myArr[0]();
            myArr[1]();
    
    function eater(){
                var food="";
                var obj={
                    eat:function (){
                        document.write("i am eating" + food);
                        food = "";
                    },
                    push: function (myFood){
                        food =myFood;
                    }
                }
                return obj;
            }
            var eater1=eater();
            eater1.push("banana");
            eater1.eat();
    

    闭包:运行结果10个10;10个函数访问的是同一个i

    function test(){
                var arr=[];
                for (var i = 0; i < 10; i++) {
                    arr[i]=function (){
                        document.write(i+" ");
                    };
                    
                }
                return arr;
            }
            var mArr=test();
            for (var i = 0; i < 10; i++) {
                mArr[i]();
            }
    

    避免闭包加上立即执行函数,一个立即执行函数对应着它里面的函数
    十个立即执行函数十个j然后里面的函数执行

    function test(){
                var arr=[];
                for (var i = 0; i < 10; i++) {
                    //要加上立即执行函数
                    (function (j){
                    arr[j]=function (){
                        document.write(j+" ");
                    };
                    }(i));
                    
                }
                return arr;
            }
            var mArr=test();
            for (var i = 0; i < 10; i++) {
                mArr[i]();
            }
    
    
    
    
        //比如
                (function (j){
                 arr[i]=function (){
                     document.write(" "+j);
                 }
                 }(0));
                 
                 (function (j){
                 arr[i]=function (){
                    document.write(" "+j);
                 }
                 }(1));
                 
                }
    

    可以实现封装,属性私有化

     var name="小明";
                 
                 function ko (age){
                     var name="小白"
                     this.age=age;
                     function hh(){
                         console.log(name)
                     }
                     return hh();
                 };
                 var zm=new ko(19);
    

    模块化开发,防止污染全局变量

    var name="小明";
                 
                 var ko=function (){
                     var name="小白"
                     function hh(){
                         console.log(name)
                     }
                     return hh();
                 }();
    

    相关文章

      网友评论

          本文标题:闭包

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