美文网首页
彻底理解闭包

彻底理解闭包

作者: 一肩月光 | 来源:发表于2017-03-19 18:15 被阅读38次
yellow

理清定义

执行环境(execution context):定义了变量或函数有权访问的其他数据。每个执行环境对应一个「变量对象」。

变量对象(variable object):包含当前能够访问的所有变量、函数总和。即是 this 所代指的内容。

作用域链:本质是一个指向变量对象的指针表,当代码被执行时就会被创建,包含有序的变量对象。(自己可以理解为一个数组[当前变量对象,上一级变量对象……全局变量对象])

活动对象(activation object):当代码进入一个环境,而此环境是一个函数时,则变量对象 = 活动变量,初始包含 arguments 对象,传入的参数变量。

闭包:有权访问另一个函数作用域中的变量的函数。

实例分析

闭包的本质是什么?
当某个函数被调用,创建一个执行环境(execution context)及作用域链,重点是,此时闭包的作用域链包含了外部函数的活动变量,由于存在引用,内存不会回收外部函数的活动变量,直到闭包被销毁。

function outer() {
  var private_val_1 = { val: 1 },
    private_val_2 = { val: 2 }

  function inner() {
    var inner_val_1 = private_val_1

    console.log(private_val_2)
  }

  return inner
}

var closure = outer()

closure() // { val: 2 }

由于 inner 函数的作用域链中,包含了 outer 函数的活动对象的索引,所以在执行 inner 函数时,会从 inner 函数 [[Scope]] 属性中,读取类似这样的一份指针列表

[outer 变量对象的引用,window 变量对象的引用]
  1. 创建一个执行环境
  2. 复制 [[Scope]] 中指向对象,构建作用域链
  3. 创建 inner 的活动对象(=变量对象)推至作用域链的顶端
  4. 访问某个变量,从作用域链中搜索
  5. 执行结束,移除执行环境,销毁局部活动对象。

反观 outer 函数执行过程,在最后一步,由于 outer 活动对象在 inner 函数的 [[Scope]] 被引用,不能被销毁,如此闭包产生。

推荐阅读:深入理解JS中声明提升、作用域(链)和this关键字

相关文章

  • 彻底理解闭包

    理清定义 执行环境(execution context):定义了变量或函数有权访问的其他数据。每个执行环境对应一个...

  • 彻底理解js闭包

    本文主要参考MDN手册和Learning Advanced JavaScript 在文章开头,我先放出MDN给出的...

  • 彻底理解JS闭包

    闭包并不是JS所独有的,在计算机科学中其是一个普遍的概念,在Python中也有闭包的概念,但闭包在Python应用...

  • 彻底理解js闭包

    点击打开视频讲解地址:https://www.bilibili.com/video/BV1Na411M7Ax/?v...

  • Gradle开发-Groovy闭包

    # 闭包 闭包的基础知识 闭包的使用 闭包 this,owner,delegate 的理解 总结 ## 闭包的基础...

  • js闭包问题

    javascript 闭包的概念,闭包的作用,闭包经典面试题详解(配图解) 函数作用域(闭包前置知识) 要彻底弄懂...

  • Swift5 闭包及其应用

    关于如何理解闭包 学习闭包的第一个难点就是理解闭包,可能很多人用了很久的闭包都还不太清楚闭包到底是什么,我这里提供...

  • 【js基础修炼之路】— 深入浅出理解闭包

    之前对于闭包的理解只是很肤浅的,只是浮于表面,这次深究了一下闭包,下面是我对闭包的理解。 什么是闭包? 引用高程里...

  • 彻底弄懂闭包

    函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起构成闭包(closure)。...

  • 关于闭包,这些你理解嘛

    今天看到了一段关于闭包的文章,感觉挺好 挺有用的 我拿过来和大家分享一下,希望看到的小伙伴都能彻底理解闭包 =>...

网友评论

      本文标题:彻底理解闭包

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