Beyond Closure in JS and Python

闭包从何而来?为什么会有闭包?

先来看一下维基百科上对于 Closure 的定义。

Closure:

其中的关键是 first-class functions 和 storing a function together with an environment

first-class functions 比较好了解,就是做到了函数可以被作为值传递给函数或被函数返回。但这里的 environment 是个什么东西呢?貌似是个很关键的东西。

经过一番深究之后,发现 environment 这个玩意确实是个很基本,但又具备着强大的解释能力。简而言之,它是一种简单的数据结构,可以用作动态语言变量管理的基本模型。至于具体怎么实现,如何实现,实现到什么程度,做哪些特殊处理,就要看语言本身自己的意愿和能力了。

然后就变成了这样一个问题:动态语言中的变量管理为什么很重要?而它具体又干了一个什么事呢?很简单,就是确定一个 name 的值到底是什么。怎么确定呢?environment 模型给出的答案就是其意思本身所指的那样:通过环境确定或修改一个 name 的值。这个 environment 模型以 frame 为基础,每一个 frame 可以用一个字典来维持 name 和 value 的映射关系,不同 frame 之间有着明确的父子关系,子 frame 可以访问并修改父 frame 中的映射关系。

以上就是 environment 模型的全部。

有了 environment 模型,再加上 first-class functions,closure 就变成了一个再自然不过的特性。

剩下的事情就是想明白一件事:scope 和 environment model 是不是一回事。

代码演示


不知是该恭喜,还是该怎样,总之阅读到该文的,你是第 人。每一次刷新,都是不同的自己。