美文网首页让前端飞
前端攻城狮必会基础之闭包理解

前端攻城狮必会基础之闭包理解

作者: 一只大橘 | 来源:发表于2019-08-12 14:42 被阅读1次

    闭包是个啥?

    一句话:函数内部的函数;
    既然是函数内部的函数,那肯定能读取函数内部的变量了;
    这个变量只能在当前的作用域读取,有私有变量的属性,
    那就是有减少全局变量污染的功效了。

    举个栗子:

    function outer(){
        var a=1;//定义一个内部变量
        return  function(){
            return a;//返回a的变量值
        }
    }
    
    var  b= outer();
    console.log(b());//输出1
    

    怎么产生一个闭包呢?

    上面提到函数内部的函数......
    那么在一个函数内部创建另一个函数就产生一个闭包了。是不是so easy!

    //栗子来了
    functinon func(){
        var a=1,b=2;
        function closure(){//闭包
           return a+b;//返回a+b的值
        }  
        return  closure;//返回闭包函数值
    }
    

    闭包的作用域链包含着它自己的作用域,以及包含它的作用域和全局作用域

    闭包的缺陷

    函数的作用域及其所有变量都会在执行结束后被销毁,但是在创建了一个
    闭包后,这个函数的作用域就会一直保存到闭包不存在为止(一直在内存中,
    会造成内存泄漏)。

    //那我们就得释放他
     function adderFunc(x){
         return function(y){
            retrun x+y;
        }     
    }
    
    var adder1=adderFunc(2);
    var adder2=adderFunc(5);
    
    console.log(adder1(2))//4
    console.log(adder2(2))//7
    adder1=null;
    adder2=null;
    

    总结

    优点:

    1. 逻辑连续,当闭包作为另一个函数调用的参数时,
      避免你脱离当前逻辑而单独编写额外逻辑。
    2. 方便调用上下文的局部变量。
    3. 加强封装性,从第2点的延伸,可以达到对变量的保护作用。

    缺点

    1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
    2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

    相关文章

      网友评论

        本文标题:前端攻城狮必会基础之闭包理解

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