今天分享的内容是,和大家一起探究的闭包,其实大家经常会被问到什么是闭包,网上的解释很多,究竟谁对呢?
今天咱们可以来探究一下,首先闭包(Closure)是一个很广泛的概念https://en.wikipedia.org/wiki/Closure
如图所示:
在很多领域都有闭包这个概念,我们要找计算机领域中找。
首先点击第一个,进入看一下,如图所示:
我们可以找一下它的历史,追本溯源,看一下定义
找到了
Peter J. Landin defined the term closure in 1964 as having an environment part and a control part as used by his SECD machine for evaluating expressions.[3]#citenote-landin-5) Joel Moses credits Landin with introducing the term _closure to refer to a lambda expression whose open bindings (free variables) have been closed by (or bound in) the lexical environment, resulting in a closed expression, or closure.[4]#citenote-6)[[5]](https://en.wikipedia.org/wiki/Closure(computerprogramming)#cite_note-7) This usage was subsequently adopted by Sussman and Steele when they defined [Scheme](https://en.wikipedia.org/wiki/Scheme(programminglanguage)) in 1975,[[6]](https://en.wikipedia.org/wiki/Closure(computer_programming)#cite_note-8) a lexically scoped variant of LISP, and became widespread.
1964年,Peter j. Landin 将闭包定义为具有环境部分和控制部分,这两个部分由 SECD 机器用于计算表达式。 [3] Joel Moses 认为 Landin 引入了术语 closure 来指代一个 lambda 表达式,这个 lambda 表达式的开放绑定(自由变量)已经被词法环境关闭(或绑定) ,从而导致一个封闭的表达式或闭包。 随后,Sussman 和 Steele 在1975年定义 Scheme 时采用了这种用法,这是 LISP 的一个词汇范围变体,并且得到了广泛的应用。
这里提到,1964年是Peter j. Landin定义的闭包的概念,为具有环境部分和控制部分,这两个部分由 SECD 机器用于计算表达式。
到这里,大致知道了闭包最初的定义了,我们还可以更近一步,去谷歌学术https://scholar.google.com/scholar?hl=zh-CN&as_sdt=0%2C5&q=Peter+J.+Landin&btnG=搜索这个前辈如下:
在线地址:The Mechanical Evaluation of Expressions P. J. Landin
6-4-308.pdf
这里有定义,闭包包含什么。
a closure has
an environment part which is a list whose two items
are:
(1) an environment
(2) an identifier or list of identifiers,
and a control part which consists of a list whose
sole item is an AE.
包括两个部分,
环境
环境包括,
环境
标识符或标识符列表
控制部分
JavaScript 的标准中,我们发现,标准中并没有出现过 closure 这个术语,但是,我们却不难根据古典定义,在 JavaScript 中找到对应的闭包组成部分。
- 环境部分
- 环境:函数的词法环境(执行上下文的一部分)
- 标识符列表:函数中用到的未声明的变量
- 表达式部分:函数体
至此,我们可以认为,JavaScript 中的函数完全符合闭包的定义。它的环境部分是函数词法环境部分组成,它的标识符列表是函数中用到的未声明变量,它的表达式部分就是函数体。
当然我发现和找到的不一定是绝对正确的,欢迎大家指正,和自己探索~
也可以看一下我在哔哩哔哩上面上传的视频
点击查看【bilibili】
点击查看【bilibili】
点击查看【bilibili】