闭包

闭包@wiki

示例

    def make_counter():
        i = 0
        def counter(): # counter() is a closure
            nonlocal i
            i += 1
            return i
        return counter

    c1 = make_counter()
    c2 = make_counter()

    print (c1(), c1(), c2(), c2())
    # -> 1 2 1 2

定义

闭包Closure是词法闭包的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。

另一种说法,闭包是由函数和及相关的引用环境组合而成的实体。

  • 闭包在运行时可以有多个实例;
  • 不同的引用环境和相同的函数组合可以产生不同的实例

某些语言表现上

在函数中定义另一个函数,如果内部函数引用了外部函数的变量,则可能产生闭包。一旦外部函数被执行,一个闭包就形成。体现为:闭包中包含了内部函数的代码,以及所需的外部函数中的变量引用。

这里,所引用的变量称作上值(upvalue)。

典型的支持闭包的语言中,通常将函数当作第一类对象。(函数可以当作参数传递、可以作为返回值、可以绑定到变量名)

关键:上值

  • 在给定函数调用的过程中,能够保持其持久性;
  • 作用域仅限于包含它们的函数,无法从其他程序代码部分进行访问;

用途

  • 因为闭包只有在被调用时才执行操作(“惰性求值”);
  • 多个函数可以使用一个相同的环境,通过改变环境可以相互交流;
  • 信息隐藏(环境);

实现方式

最直接的想法应该是定义一个特殊的数据结构,保存函数指针 & 非local变量的指针。

而使用函数调用栈的就比较困难了,因为外部函数在返回时出栈,依赖GC机制可以把外部函数的变量(闭包的非local变量)留存起来。

Cetegories

Pages

Subscribe

RSS

Contacts