`
matt.u
  • 浏览: 130282 次
  • 性别: Icon_minigender_1
  • 来自: CQ
社区版块
存档分类
最新评论

函数编程之闭包漫谈(Closure)

阅读更多
转载自http://www.cnblogs.com/Jifangliang/archive/2008/08/05/1260602.html
在函数编程中经常用到闭包。闭包是什么,它是怎么产生的及用来解决什么问题呢。给出字面的定义先:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)。这个从字面上很难理解,特别对于一直使用命令式语言进行编程的程序员们。本文将结合实例代码进行解释。
函数是什么
地球人都知道:函数只是一段可执行代码,编译后就“固化”了,每个函数在内存中只有一份实例,得到函数的入口点便可以执行函数了。在函数式编程语言中,函数是一等公民(First class value:第一类对象,我们不需要像命令式语言中那样借助函数指针,委托操作函数),函数可以作为另一个函数的参数或返回值,可以赋给一个变量。函数可以嵌套定义,即在一个函数内部可以定义另一个函数,有了嵌套函数这种结构,便会产生闭包问题。如:
>>> def ExFunc(n):
     sum=n
     def InsFunc():
             return sum+1
     return InsFunc

>>> myFunc=ExFunc(10)
>>> myFunc()
11
>>> myAnotherFunc=ExFunc(20)
>>> myAnotherFunc()
21
>>> myFunc()
11
>>> myAnotherFunc()
21
>>>


在这段程序中,函数InsFunc是函数ExFunc的内嵌函数,并且是ExFunc函数的返回值。我们注意到一个问题:内嵌函数InsFunc中引用到外层函数中的局部变量sum,IronPython会这么处理这个问题呢?先让我们来看看这段代码的运行结果。当我们调用分别由不同的参数调用 ExFunc函数得到的函数时(myFunc(),myAnotherFunc()),得到的结果是隔离的,也就是说每次调用ExFunc函数后都将生成并保存一个新的局部变量sum。其实这里ExFunc函数返回的就是闭包。

引用环境
按照命令式语言的规则,ExFunc函数只是返回了内嵌函数InsFunc的地址,在执行InsFunc函数时将会由于在其作用域内找不到sum变量而出错。而在函数式语言中,当内嵌函数体内引用到体外的变量时,将会把定义时涉及到的引用环境和函数体打包成一个整体(闭包)返回。现在给出引用环境的定义就容易理解了:引用环境是指在程序执行中的某个点所有处于活跃状态的约束(一个变量的名字和其所代表的对象之间的联系)所组成的集合。闭包的使用和正常的函数调用没有区别。

由于闭包把函数和运行时的引用环境打包成为一个新的整体,所以就解决了函数编程中的嵌套所引发的问题。如上述代码段中,当每次调用ExFunc函数时都将返回一个新的闭包实例,这些实例之间是隔离的,分别包含调用时不同的引用环境现场。不同于函数,闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。
分享到:
评论

相关推荐

    Python闭包实例closure.py

    Python闭包实例closure.py 简单示例闭包的使用 简单示例闭包的使用

    理解javascript函数式编程中的闭包(closure)_.docx

    本篇文章主要探讨JavaScript函数式编程中的一个重要概念——闭包(closure)。闭包是一种特殊的函数,它能记住其定义时的作用域,即使在函数执行完毕后,仍然可以访问到该作用域内的变量。在JavaScript中,每个函数...

    JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解

    闭包的作用之一是可以从外部读取一个函数内部的变量。这可以通过在外部函数中定义一个内嵌函数,并将这个内嵌函数返回给外部环境来实现。由于JavaScript中的函数实际上就是变量,因此它们可以像其他变量一样被引用。...

    closure闭包

    在编程语言理论中,"closure"一词通常指的是“闭包”,它是一个非常重要的概念,尤其是在函数式编程和动态类型语言中。闭包是函数和与其相关的引用环境(即变量的值)的组合,这个组合使得函数能够记住它被定义时的...

    php的闭包(Closure)匿名函数详解_.docx

    在实际编程中,闭包还可以用于优化代码,比如在`foreach`循环中,使用闭包作为回调函数可以简化代码结构,提高代码可读性和维护性。例如,一个购物车类可能需要计算所有商品的总价,这时候可以使用闭包来遍历商品并...

    理解javascript函数式编程中的闭包(closure)

    闭包是函数式编程的核心概念之一,它允许一个函数访问并操作函数外部的变量。在JavaScript中,闭包的实现尤为特殊和强大,因为JavaScript中的函数本身就是一等公民,可以被赋值给变量,作为参数传递,或者作为返回值...

    求闭包 属性集闭包 函数依赖的闭包

    1. 由用户输入函数依赖,当用户输入End时,表示所有依赖都输入完毕。(即函数依赖是由用户自己定的,程序中不能假定某个具体的依赖)。 2. 函数依赖的形式是ABC, ABE这样的形式,为了简单起见,我们假定所有的属性...

    JavaScript闭包(closure).pdf

    JavaScript中的闭包是一种高级特性,它是函数和其周围状态(词法作用域)的组合,即使函数在其定义的作用域之外被调用,它仍然能访问到这些状态。这个概念是JavaScript编程中的核心部分,尤其在处理异步操作、模块化...

    Swift编程语言中函数与闭包的详细介绍及实战应用

    内容概要:本文详细介绍了Swift编程语言中的函数与闭包概念,包括函数的基础用法(声明与调用、参数与返回值)、函数类型与变量、内嵌函数与函数链、闭包的概念及其各种高级用法(尾随闭包、隐式返回闭包、捕获列表...

    C# 中闭包(Closure)详解

    C# 中的闭包(Closure)是一种非常重要的概念,它允许函数在其定义的作用域之外捕获和使用变量。下面我们将详细地介绍什么是闭包,如何使用闭包以及闭包的应用场景。 什么是闭包? 闭包(Closure)是指一个函数和...

    Python 函数式编程和高阶函数 08使用闭包求两点之间的距离.mp4

    Python 函数式编程和高阶函数 08使用闭包求两点之间的距离.mp4

    Closure闭包函数示例

    补充说明:闭包可以使用USE关键连接外部变量。 总结:PHP闭包的特性...不过匿名函数还是挺有用的,比如在使用preg_replace_callback等之类的函数可以不用在外部声明回调函数了。合理使用闭包能使代码更加简洁和精炼。

    js高级函数之闭包

    js高级中的函数之闭包函数全解与应用场景(循环闭包,定时器,面试题)

    python 函数 函数的偏函数 高阶函数 返回函数 匿名函数 闭包.md

    它们是函数式编程语言中的核心概念之一,在 Python 中也同样具有重要意义。 ##### 概念 当一个函数 A 的参数可以接收另一个函数时,称这个函数 A 为高阶函数。 ##### 注意事项 1. 在 Python 中,函数就像任何...

    php的闭包(Closure)匿名函数详解

    PHP中的闭包(Closure)是自PHP 5.3版本开始引入的一个重要特性,它允许创建匿名函数,并在需要时作为变量传递。闭包在很多情况下能大幅简化代码,提高代码的可读性和可维护性。 闭包的基本语法非常直接,但需要...

    PHP闭包(Closure)使用详解

    在PHP编程语言中,闭包(Closure)是一种特殊类型的函数,它可以访问并操作其外部作用域中的变量,即使这些变量在其定义的函数之外。闭包的概念首次在PHP 5.3版本中引入,使得PHP开发者能够更好地利用面向对象编程和...

Global site tag (gtag.js) - Google Analytics