闭包

一、闭包技术详解

1.1 什么是闭包?

  • 闭包实际上是一种函数,所以闭包技术也是函数技术的一种;闭包能做的事情函数几乎都能做。

  • 闭包技术花式比较多,用法也比较灵活,一般开发人员在学习闭包的时候都会遇到瓶颈,主要是因为闭包技术的分界线并不明显。几乎无法用一个特点去区分。

  • 当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包。

    function A(){
       function B(){
           console.log("Hello PAT");
       }
       return B;
    }
    var b = A();
    b();//Hello PAT!
    
    
  • 闭包的最大用处有两个:一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

    [图片上传中...(image-e1c0b1-1512200440220-1)]

1.2 封闭作用域

  • JavaScript的GC机制

    • 在javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收,否则这个对象一直会保存在内存中。
  • 封闭作用域

    • 封闭作用域又称值为封闭空间,还有一个昵称叫小闭包,以及匿名函数自调。

    • 基本结构:

      
      (function(){})();
      ;(function(){})();
      +(function(){})();
      -(function(){})();
      ?(function(){})();
      
      
  • 技法最大目的: 全局变量私有化

  • 技术优点:

    • 不污染全局空间!

    • 内部所有的临时变量执行完毕都会释放不占内存。

    • 可以保存全局数据。

    • 更新复杂变量。

1.3 作用域链

  • 嵌套之间的函数会形成作用域链,每次对变量的访问实际上都是对整条作用域链的遍历查找。先查找最近的作用域,最后再查找全局作用域。如果在某个作用域找到了对量就会结束本次查找过程。

  • 思考?

    • 对于作用域全局作用域查找快,还是局部作用域查找快?
    • 局部作用域查找要远远大于全局作用域查找的速度。所以高级的程序设计一般是尽量避免全局查找。
    • 每次访问都是对作用域链的一次遍历查找其中全局作用域是最耗费时间的。
  • 解决方案:

    • 当前目标使用完以后,在退出作用域之前储存这个目标,就可以在下次取到上一次的目标。
  • 补充:

    变量的生命周期 任何一个变量在内存中都是一个引用,这个变量是有自己的生命周期。周期结束意味着被销毁。 一个变量在它当前的作用域内被声明那一刻相当于变量出生,整个当前作用域执行完毕并退出作用域相当于变量的寿命终止。

1.4 保存作用域

  • 保存作用域是一种更高级的闭包技术,如果函数嵌套函数,那么内部的那个函数将形成作用域闭包。简单的说,这种闭包能够达到的好处就是让指令能够绑定一些全局数据去运行;

  • 基本结构:

     var A=function(){
         return function(){};
     }

  • 优点:

    • 全局数据隐藏化

    • 可以让某个指令运行时候绑定一些隐藏的全局数据在身上。

  • 一句话: 将数据绑定在指令上运行,让指令不再依赖全局数据。

你可能感兴趣的:(闭包)