闭包

2018-12-25  本文已影响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();
             }();
上一篇 下一篇

猜你喜欢

热点阅读