闭包的探索

Posted xuxiaojian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了闭包的探索相关的知识,希望对你有一定的参考价值。

闭包的概念、形式与应用

什么是闭包?

对闭包的具体定义有很多种说法,这些说法大体可以分为两类: 说法1:闭包是符合一定条件的函数,比如闭包是在其词法上下文中引用了自由变量的函数。 说法2:闭包是由函数和与其相关的引用环境组合而成的实体。比如在实现深约束时,需要创建一个能显式表示引用环境的东西,并将它与相关的子程序捆绑在一起,这样捆绑起来的整体被称为闭包。

具体可以看这个文章《闭包的概念、形式与应用

结合实际代码分析闭包

支持了闭包的语言有很多,这里以go语言为例。

将函数作为一个函数的返回值

package main

import "fmt"

func add() func(int) int {  ---add()函数返回一个匿名函数
     sum := 0               ---add()内部的局部变量
     return func(x int) int {   ----返回一个匿名函数,下文提到的匿名函数均指该函数
          sum += x          ----函数内部实现sum+参数x
          return sum
     }
}

func main() {
     pos, neg := add(), add() ----将两个add()函数的返回(上面的匿名函数)分别赋给两个变量,也就是说这两个变量代表的其实就是两个函数
     for i := 0; i < 10; i++ {
          fmt.Println(
               pos(i),  ----相当于上面匿名函数调用,参数为i
               neg(-2*i),   --------相当于上面匿名函数调用,参数为-2*i
          )
     }
}

我们来看看执行结果:

0 0
1 -2
3 -6
6 -12
10 -20
15 -30
21 -42
28 -56
36 -72
45 -90

从结果可以看出来,在循环里面每次顺序调用pos, neg两个函数,即连续调用两次上述匿名函数。

第一次循环体执行之后结果都为0就不说了;第二次循环体执行时调用pos时参数为i=1,经过调用pos函数(内部对局部变量sum+i)返回的sum变为1;调用neg时参数为i=1,经过调用pos函数(内部对局部变量sum+(-2*i))返回的sum变为-2。

注意,调用neg时并没有因为调用pos使sum变为1,而在sum=1的基础上做sum+(-2*i),sum仍是以0值进行计算。

第三次循环体执行时,pos和neg内部分别以自己上次调用返回的sum作为新值进行计算。

pos和neg内部的sum是互相隔离的,在pos调用之后调用neg,会将sum变为neg之前对应的sum值;neg调用之后调用pos,同样也会将sum变为pos之前对应的值。这也就证实了上面关于闭包的说法2更确切一点。即闭包是函数和与其相关的引用环境打包之后的一个整体

将函数作为一个函数的参数

---未完待续---

以上是关于闭包的探索的主要内容,如果未能解决你的问题,请参考以下文章

闭包的探索

JS---闭包

DOM探索之基础详解——学习笔记

scala编程——函数和闭包

由于lambda闭包或调度程序问题,程序可能会挂起

javascript 匿名函数及闭包----转载