什么是闭包?为什么叫闭包?

2022-12-16 0 781

什么是闭包?为什么叫闭包?

《JavaScript ES6 表达式式程式设计进阶经典之作》4.1认知旋量群:

简而言之,旋量群是三个外部表达式。所以甚么是外部表达式呢?它是在另三个表达式外部的表达式。比如说:

function outer() { function inner() { // body… } }

这是旋量群,表达式inner称作旋量群表达式。旋量群表达式这般强悍的其原因是它对返回值链的出访。

什么是闭包?为什么叫闭包?

《JavaScript高阶面向第一类(第3版) [Professional JavaScript for Web Developers 3rd Edition] 》

7.2 旋量群

有许多开发者常常分不清非官方表达式和旋量群这三个基本概念,因而时常搞混。旋量群是指无权出访另三个表达式返回值的表达式。建立旋量群的常用形式,是在三个表达式内,建立另三个表达式。

什么是闭包?为什么叫闭包?

《标识符之髓 C语言核心理念基本概念》

标识符这髓 第11章 第一类与类 11.5

甚么是旋量群

说到旋量群( closure)这个基本概念,想必很多人一时也说不出究竟何为旋量群。它是建立具有第一类性质的事物的一种技术。

很多语言都支持定义带有某种状态的表达式。比如说,可以定义像计数器一样每调用一次显示的数字加1的表达式。我们用 JavaScript语言来实现一下。

function makeCounter(){ var count = 0 function push(){ count++; console. log(count); } returnpush; } c = makeCounter() c()// -> 1 c() // -> 2 c() // -> 3

这段标识符中,表达式 makeCounter中定义了变量 count和表达式push,并返回表达式push。然后,通过调用表达式 makeCounter将返回值赋给变量c,然后调用它三次。每调用一次,显示的值就加1.这是怎么做到的呢?表达式 make Counter首先建立了一张名字和值的对照表,把变量 count的值设为0.然后定义了表达式push,并将其返回。表达式push将其被定义时的对照表一同带出 makeCounter表达式。随后,每当被调用时,表达式push在被定义时的对照表的值就加1。

事实上,并没有所谓旋量群的特殊的语法结构。如果有一种语言,它可以在表达式中定义表达式,有允许嵌套的静态返回值,并且可以把表达式作为返回值传递给变量,所以它只要通过表达式的嵌套就可以实现带有某种状态的表达式

为甚么叫做旋量群

看到旋量群这个名字,总有一种甚么东西被严实地包裹起来了的感觉。为甚么会叫做旋量群呢?某 Standard ML的教材上做了如下解释。

为甚么把这称作旋量群?三个包含了自由变量的开放表达式,它和该自由变量的约束环境组合在一起后,实现了一种封闭的状态。

—- Ake Wikstrom, Functional programming using standard ML, Prentice-Hall, 1987.

拿上面一段标识符来讲,表达式push使用了变量 count,然而该变量并不是在表达式push中定义的。这种变量被称作自由变量。表达式push是三个包含了自由变量的开放表达式。而表达式 makeCounter的对照表中为0的值和为 count的名字结合在了一起。这种给值绑定三个名字的操作叫做(名字)约束。

这样开放表达式push和 makeCounter的对照表组合配套之后,无需在这以外的返回值中寻找变量的定义,从而达到了某种完备的状态。通过这样表现出一种封闭的属性。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务