`

闭包 (closure)是啥?

阅读更多
闭包
  闭包 (closure)是啥?
  闭包:基本概念
  闭包是可以包含自由(未绑定)变量的代码块;这些变量不是在这个代码块或者任何全局上下文中定义的,而是在定义代码块的环境中定义。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量的存在,相关变量引用没有释放)和为自由变量提供绑定的计算环境(作用域)。在 Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby 和 Python 等语言中都能找到对闭包不同程度的支持。
  闭包的价值在于可以作为函数对象 或者匿名函数,对于类型系统而言这就意味着不仅要表示数据还要表示代码。支持闭包的多数语言都将函数作为第一级对象,就是说这些函数可以存储到变量中、作为参数传递给其他函数,最重要的是能够被函数动态地创建和返回。
  闭包的本质
  集合 <math>S<math> 是闭集当且仅当 <math>Cl(S)=S<math>。特别的,空集的闭包是空集,<math>X<math> 的闭包是 <math>X<math>。集合的交集的闭包总是集合的闭包的交集的子集(不一定是真子集)。有限多个集合的并集的闭包和这些集合的闭包的并集相等;零个集合的并集为空集,所以这个命题包含了前面的空集的闭包的特殊情况。无限多个集合的并集的闭包不一定等于这些集合的闭包的并集,但前者一定是后者的父集
  若 <math>A<math> 为包含 <math>S<math> 的 <math>X<math> 的子空间,则 <math>S<math> 在 <math>A<math> 中计算得到的闭包等于 <math>A<math> 和 <math>S<math> 在 <math>X<math> 中计算得到的闭包(<math>Cl_A(S) = A\cap Cl_X(S)<math>)的交集。特别的,<math>S<math> 在 <math>A<math> 中是稠密的,当且仅当 <math>A<math> 是 <math>Cl_X(S)<math> 的子集。
  闭包点
  对欧几里德空间的子集 S,x 是 S 的闭包点,若所有以 x 为中心的开球都包含 S 的点(这个点也可以是 x)。
  这个定义可以推广到度量空间 X 的任意子集 S。具体地说,对具有度量 d 的度量空间 X,x 是 S 的闭包点,若对所有 r > 0,存在 y 属于 S,使得距离 d(x, y) < r(同样的,可以是 x = y)。另一种说法可以是,x 是 S 的闭包点,若距离 d(x, S) := inf{d(x, s) : s 属于 S} = 0(这里 inf 表示下确界)。
  这个定义也可以推广到拓扑空间,只需要用邻域替代“开球”。设 S 是拓扑空间 X 的子集,则 x 是 S 的闭包点,若所有 x 邻域都包含 S 的点。注意,这个定义并不要求邻域是开的。
  极限点
  闭包点的定义非常接近极限点的定义。这两个定义之间的差别非常微小但很重要——在极限点的定义中,点 x 的邻域必须包含和 x 不同的集合的点。
  因此,所有极限点都是闭包点,但不是所有的闭包点都是极限点。不是极限点的闭包点就是孤点。也就是说,点 x 是孤点,若它是 S 的元素,且存在 x 的邻域,该邻域中除了 x 没有其他的点属于 S。
  对给定的集合 S 和点 x,x 是 S 的闭包点,当且仅当 x 属于 S,或 x 是 S 的极限点。
  集合的闭包
  集合 S 的闭包是所有 S 的闭包点组成的集合。S 的闭包写作 cl(S),Cl(S) 或 S−。集合的闭包具有如下性质:
  cl(S) 是 S 的闭父集。
  cl(S) 是所有包含 S 的闭集的交集。
  cl(S) 是包含 S 的最小的闭集。
  集合 S 是闭集,当且仅当 S = cl(S)。
  若 S 是 T 的子集,则 cl(S) 是 cl(T) 的子集。
  若 A 是闭集,则 A 包含 S 当且仅当 A 包含 cl(S)。
  有时候,上述第二或第三条性质会被作为拓扑闭包的定义。
  在第一可数空间(如度量空间)中,cl(S) 是所有点的收敛数列的所有极限。
  Perl中的闭包
  闭包 (closure)是个精确但又很难解释的电脑名词。在 Perl 里面,闭包是以 匿名函数的形式来实现,具有持续参照位于该函数范围之外的文字式变数值的能力。 这些外部的文字变数会神奇地保留它们在闭包函数最初定义时的值 (深连结)。
  如果一个程式语言容许函数递回另一个函数的话 (像 Perl 就是),闭包便具有意义。要注意的是,有些语言虽提供匿名函数的功能,但却无法正确处理闭包; Python 这个语言便是一例。如果要想多了解闭包的话,建议你去找本功能性程式 设计的教科书来看。Scheme这个语言不仅支援闭包,更鼓励多加使用。
  以下是个典型的产生函数的函数:
  sub add_function_generator {
  return sub { shift + shift };
  }
  $add_sub = add_function_generator();
  $sum = &$add_sub(4,5); # $sum现在是 9了
  闭包用起来就像是个函数样板,其中保留了一些可以在稍後再填入的空格。 add_function_generator() 所递回的匿名函数在技术上来讲并不能算是一个闭包, 因为它没有用到任何位在这个函数范围之外的文字变数。
  把上面这个例子和下面这个make_adder()函数对照一下,下面这个函数所递回的匿名函数中使用了一个外部的文字变数。这种指名外部函数的作法需要由 Perl递回一个适当的闭包,因此那个文字变数在匿名函数产生之时的值便永久地被锁进闭 包里。
  sub make_adder {
  my $addpiece = shift;
  return sub { shift + $addpiece };
  }
  $f1 = make_adder(20);
  $f2 = make_adder(555);
  这样一来&$f1($n) 永远会是 20加上你传进去的值$n ,而&$f2($n) 将 永远会是 555加上你传进去的值$n。$addpiece的值会在闭包中保留下来。
  闭包在比较实际的场合中也常用得到,譬如当你想把一些程式码传入一个函数时:
  my $line;
  timeout( 30, sub { $line = <STDIN> } );
  如果要执行的程式码当初是以字串的形式传入的话,即'$line = <STDIN>' ,那么timeout() 这个假想的函数在回到该函数被呼叫时所在的范围後便无法再撷取$list这个文字变数的值了。
  在Javascript中闭包(Closure)
  闭包的两个特点:
  1、作为一个函数变量的一个引用 - 当函数返回时,其处于激活状态。
  2、一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
  例1。
  <script type="text/javascript">
  function sayHello2(name) {
  var text = 'Hello ' + name; // local variable
  var sayAlert = function() { alert(text); }
  return sayAlert;
  }
  var sy = sayHello2('never-online');
  sy();
  </script>
分享到:
评论

相关推荐

    Python闭包实例closure.py

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

    closure闭包

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

    js闭包是什么?.pdf

    闭包(Closure)是函数和声明该函数的词法环境的组合。简单来说,一个闭包允许一个函数访问并操作函数外部的变量。在JavaScript中,由于函数是一等公民,即函数可以作为参数传递,也可以作为值返回,这为闭包的形成...

    Swift语言利用Closure闭包实现反向传值Demo

    在Swift中,Closure(闭包)是一种非常重要的特性,它允许我们定义一段可移动和可重用的代码块,可以捕获和存储其所在上下文的变量。在本Demo“Swift语言利用Closure闭包实现反向传值Demo”中,我们将深入探讨如何...

    python中闭包Closure函数作为返回值的方法示例

    首先看看闭包的概念:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,闭包是由函数和与其...

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

    闭包(Closure)是一个可以包含自由变量的代码块,这个自由变量并不是在这个代码块或任何全局上下文中定义的,而是在定义代码块的环境中定义。简单来说,闭包就是在一个函数内部定义另一个函数,内层函数可以引用...

    Swift语言采用Closure闭包进行传值Demo

    在Swift中,Closure(闭包)是一种强大的功能,可以捕获和存储其所在上下文中的引用。本Demo通过闭包展示了在两个视图控制器之间如何实现反向传值,这与Objective-C(OC)中的Blocks概念有相似之处,但也有其独特之...

    php的instanceof和判断闭包Closure操作示例

    在本文中,我们将深入探讨 `instanceof` 的用法以及与闭包(Closure)相关的概念。 `instanceof` 运算符的工作方式如下: ```php $a = new MyClass; var_dump($a instanceof MyClass); // 输出 bool(true) var_...

    Closure闭包函数示例

    补充说明:闭包可以使用USE关键连接外部变量。 总结:PHP闭包的特性其实用CLASS就可以实现类似甚至强大得多的功能,更不能和js的闭包相提并论了吧,只能期待PHP以后对闭包支持的改进。不过匿名函数还是挺有用的,...

    JavaScript闭包(closure).pdf

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

    Swift语言采用Closure闭包实现反向传值Demo

    在Swift中,Closure(闭包)是一个重要的概念,它允许我们定义代码块并将其作为值传递。在这个"Swift语言采用Closure闭包实现反向传值Demo"中,我们将深入探讨如何使用闭包在两个视图控制器之间进行反向数据传递,...

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

    PHP中的闭包(Closure)匿名函数是在PHP 5.3版本引入的新特性,它是一种能够捕获和操作外部变量的函数。闭包提供了一种在函数内部访问和修改外部作用域变量的能力,而无需通过全局变量或类成员来实现。这在很多场景...

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

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

    closure闭包1

    - 在Groovy中,闭包是 `groovy.lang.Closure` 类的实例,这意味着你可以将闭包赋值给变量,作为参数传递,或者作为其他对象的字段。例如: ```groovy def myClosure = { println 'Hello, World!' } ``` 3. **...

    C# 中闭包(Closure)详解

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

    闭包权威指南] Closure:The Definitive Guide Michael Bolin

    《闭包:权威指南》(Closure: The Definitive Guide)由Michael Bolin撰写,于2010年由O'Reilly Media出版。本书是关于JavaScript闭包的深度解析与应用实践的权威之作,深入探讨了闭包在JavaScript中的各种应用场景...

    计算NFA中ε闭包

    3. **ε闭包计算**:`E_closure`函数采用递归方式实现,对于每个状态,它会输出该状态的所有ε闭包状态,并递归地计算这些状态的ε闭包。 4. **主函数**:`main()`函数中调用了`input()`函数读取NFA描述信息,并...

    谈谈我对JavaScript原型和闭包系列理解(随手笔记6)

    闭包是Closure,这是静态语言所不具有的一个新特性。但是闭包也不是什么复杂到不可理解的东西,简而言之,闭包就是: • 闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在。 • 闭包就是就是...

Global site tag (gtag.js) - Google Analytics