Closure JavaScript中的闭包

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

在谈闭包的时候,有个概念需要说明一下: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()
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 一、变量...
    风萧萧易水寒_1196阅读 310评论 0 0
  • 闭包没有想象的那么简单 闭包的概念在JavaScript中占据了十分重要的地位,有不少开发者分不清匿名函数和闭包的...
    老马的春天阅读 778评论 2 8
  • 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 一、变量...
    zouCode阅读 1,361评论 0 13
  • ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...
    lzyuan阅读 1,038评论 0 0
  • JS的闭包真的是一个老生常谈的知识点了,无奈它并不是那么好掌握,但是它又是那么重要,很多高级应用的开发都会用到闭包...
    一木_qintb阅读 373评论 0 1

友情链接更多精彩内容