Closure JavaScript中的闭包

2019-10-08  本文已影响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()
上一篇下一篇

猜你喜欢

热点阅读