让前端飞

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

2019-08-12  本文已影响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),这时一定要小心,不要随便改变父函数内部变量的值。

上一篇 下一篇

猜你喜欢

热点阅读