美文网首页
Closure JavaScript中的闭包

Closure JavaScript中的闭包

作者: 四月白绵羊 | 来源:发表于2019-10-08 04:49 被阅读0次

    维基百科中的解释,闭包存储了函数以及函数定义时的环境变量(自由变量)。

    在谈闭包的时候,有个概念需要说明一下:Scope Chain 作用域链。

    Scope Chain

    每个函数都有自己的作用域以及外部的作用域,甚至是全局的作用域。当函数试图访问一个变量的时候,会现在这个函数的local env中查找。如果没有,就到外部环境中查找。一层一层往外寻找,直到找到对应的变量或者到达了global env还是没有找到,那么这个变量就是undefined。
    举一个例子:

    let txt = 'This is outsides.';
    function log () {
        let txt = 'This is insides.';
        console.log(txt);
    }
    log();
    
    // The output: This is insides.
    

    输出的结果是This is insides而不是This is insides.的原因就是,函数先从最内层作用域开始寻找这个变量,一旦找到了就不在接着寻找了。

    Use Case

    1. 缓存变量
      当你在闭包当中访问了外部变量的时候,这个变量会被添加到这个闭包当中,即Execution Context。这种办法能使得外部的一些临时变量不会被当做垃圾清理了。

    2. 实现单例
      其实这也是缓存变量的应用。在代码上:

    class Earth(){...}
    
    function TheEarth(){
      let singleton = null;
      return {
          getEarth(){
            if (singleton){ return singleton; }
            createEarth();
            return singleton;
          }
          createEarth(){ singleton = new Earth(); }
      }
    }
    
    export default TheEarth();
    

    然后,你就可以调用了:

    import TheEarth from '../Earth';
    
    TheEarth.getEarth()
    

    相关文章

      网友评论

          本文标题:Closure JavaScript中的闭包

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