zoukankan      html  css  js  c++  java
  • 闭包的探索

    闭包的概念、形式与应用

    什么是闭包?

    对闭包的具体定义有很多种说法,这些说法大体可以分为两类: 说法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更确切一点。即闭包是函数和与其相关的引用环境打包之后的一个整体

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

    ---未完待续---

  • 相关阅读:
    windows CMD大全
    算法导论(一):渐进记号
    数据结构之树
    Python读取文件内容与存储
    Python绘图的颜色设置
    Python中多个列表与字典的合并方法
    Pandas之Dataframe叠加,排序,统计,重新设置索引
    数据挖掘——聚类算法(一)
    WPF学习————制作时钟
    Opencv Sharp 基于灰度模板的多目标匹配
  • 原文地址:https://www.cnblogs.com/xuxiaojian/p/9498699.html
Copyright © 2011-2022 走看看