闭包基础概念理解

谈谈闭包

本文讨论闭包的相关概念,大部分代码使用Swift编写。Swift对闭包有着良好的支持。这是由于,Swift被设计成一门必定程度上支持函数式编程范式的编程语言。而函数式编程和闭包有着紧密的联系。本文着重讨论的也是函数式编程和闭包之间的关系。编程

变量,约束,环境和函数

在讨论闭包以前,须要先明晰一些简单的概念。swift

变量

计算机程序语言中必不可少的一部分是它须要提供一种经过名字去使用计算对象的方式。也就是,咱们须要能为计算对象标识一个名字。名字标识符就是咱们常说的变量,而它的值就是它所对应的那个对象。若是要在编程语言中使用这些变量,咱们就须要有将值和变量名关联起来,和在须要时又能够将值提取出来的能力。这就意味着编程语言须要提供某种存储能力,将变量名和值的对应关系存储下来,以便须要时使用。数组

约束

将变量名关联于对应的值,就构成了一个约束。任何变量至多只能有一个约束。这很容易理解,由于使用变量名取数据时,你固然但愿它指明的是明确并且惟一的值。这也是为什么把变量名和值的对应关系称为约束的缘由。闭包

环境

一系列这种名字和值对应关系(约束)的存储,就能够称之为环境。环境对于程序语句是相当重要的,由于它肯定了每一个表达式的上下文。甚至,咱们能够说环境决定了表达式的含义。由于,即使是肯定像(1 + 1)这么简单的语句的具体含义,也有赖于环境来肯定+是表达加法的运算符号。咱们能够假定程序的运行时拥有一个全局环境,这个环境里包含了全部关联于基本过程的符号的值。例如,符号+就在全局环境中被约束到基本的加法运算。编程语言

函数

函数,是大部分编程语言都存在的概念。它在不一样语言中这个概念也存在着细微的区别。在面向对象编程语言中称之为“方法”,在函数式编程语言中称之为“过程”。不管被称为何名字,它们都拥有的共同基本含义是:它是编程语言的一种基本的抽象手段,使咱们能够将一组操做做为一个单元组合起来,并为这组操做命名。这样咱们就能够经过一个简单的名字操做一组复杂的操做。而对于不一样的编程语言中“函数”这一实体所存在的细微差异,咱们会在后文中经过对“闭包”的探讨加以说明。函数式编程

闭包

在说闭包以前,须要先清楚“自由变量”的概念。在某个做用域中,若是使用未在本做用域中声明的变量,对于此做用域来讲,该变量就是一个自由变量。函数

闭包,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即便已经离开了创造它的环境也不例外。另外一种说法认为闭包并非函数,而是由函数和与其相关的引用环境组合而成的实体。这是由于,闭包在运行时能够有多个实例,不一样的引用环境和相同的函数组合能够产生不一样的实例。而函数只会有一个实例。这两种定义对闭包的见解并无不一样,只是对函数的定义不一样。前者对函数的定义更宽松,后者则更为严格。设计

原文对象

相关文章
相关标签/搜索