问题 函数和闭包有什么区别? [关闭]


我一直在阅读iBooks中的swift编程指南。有人可以向我解释一下函数和闭包之间的区别。它只是没有名称,可以在表达式中使用吗?


9627
2018-06-08 17:13


起源



答案:


事实上,函数只是命名闭包。以下至少在概念上是等效的:

let foo = { println("hello") }

func foo()->(){ println("hello") }

在使用的情况下,这会变得更复杂一些 func 声明方法,因为在公共命名参数的自动插入等方面添加了一些有趣的糖。 func myMethod(foo:Int, bar:Int, baz:Int) 变 func myMethod(foo:Int, #bar:Int, #baz:Int), 例如。

但是,即使方法只是闭包的一个特例,它仍然是正确的,如果闭包也是如此,那么函数和方法也是如此。


8
2018-06-08 17:18



基本上就像 function () {...} 在JS? - Jehan
几乎。在javascript中,闭包是匿名函数。在Swift中,函数被命名为闭包。但我会坦然承认,区别主要是语义而不是非常重要。 - jemmons
“在javascript中,闭包是匿名函数。在Swift中,函数被命名为闭包。”这两个定义是等价的。听起来没有区别,语义或其他方面。 - Will


答案:


事实上,函数只是命名闭包。以下至少在概念上是等效的:

let foo = { println("hello") }

func foo()->(){ println("hello") }

在使用的情况下,这会变得更复杂一些 func 声明方法,因为在公共命名参数的自动插入等方面添加了一些有趣的糖。 func myMethod(foo:Int, bar:Int, baz:Int) 变 func myMethod(foo:Int, #bar:Int, #baz:Int), 例如。

但是,即使方法只是闭包的一个特例,它仍然是正确的,如果闭包也是如此,那么函数和方法也是如此。


8
2018-06-08 17:18



基本上就像 function () {...} 在JS? - Jehan
几乎。在javascript中,闭包是匿名函数。在Swift中,函数被命名为闭包。但我会坦然承认,区别主要是语义而不是非常重要。 - jemmons
“在javascript中,闭包是匿名函数。在Swift中,函数被命名为闭包。”这两个定义是等价的。听起来没有区别,语义或其他方面。 - Will


首先,让我们开始吧 关闭的定义,如维基百科中所见:

在编程语言中,闭包(也是词法闭包或函数   closure)是一个函数或函数的引用   引用环境 - 存储对每个引用的引用的表   非局部变量(也称为自由变量或上变量)   功能。

闭包是用于引用函数及其“关闭”的环境变量的术语。

Swift中Closure的定义是内联的 lambda表达式 和  在其他语言中,如C#和Ruby。

至于与功能的区别,来自 Swift文档

实际上,函数中引入的全局函数和嵌套函数   特殊情况的封闭

因此,所有函数本质上都是闭包,用于在其上下文中存储对变量的引用。

Closure expressions 是编写闭包的便捷方式,并提供更简洁的语法。


7
2018-06-08 17:19



@jemmons - 我还在补充答案。 - manojlds
@jemmons - 是的。我经常迭代我的答案,但在这种情况下点击提交太快了。 - manojlds