Swift 中的闭包概念与 Javascript 中的闭包相似吗?

Rud*_*udi 5 javascript closures swift

Swift 中闭包的一般概念是否类似于 Javascript 中的闭包,或者它们是否使用相同的单词“closure”但具有不同的规则?具体来说,(引用我的朋友的话)Javascript 中的闭包是“只能在创建它的地方查看水晶球”。

因此,在 Javascript 中,此代码有效:

var outside = 5;
function test() {
 alert(outside); // returns 5
}
Run Code Online (Sandbox Code Playgroud)

这是否意味着在 Swift 中,如果我以任何可能的方式创建闭包,它将可以访问创建闭包的同一范围内的所有局部变量?

(我看过维基百科对编程闭包的定义,但感觉太模糊了——具体来说,闭包跟踪的是什么值)

Col*_*inE 0

Swift 闭包捕获局部变量,因此满足您的“只能在创建的地方查看水晶球”的要求。

\n\n

由于作用域的不同,Swift 不会遇到在循环内使用闭包的相同问题

\n\n

JavaScript 循环内闭包 \xe2\x80\x93 简单实用示例

\n\n

斯威夫特等效:

\n\n
var funcs: [()->()] = []\n\nfor i in 0...3 {\n  funcs += {\n    println(i)\n  }\n}\n\nfor i in 0...3 {\n  println(funcs[i]())\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

产生结果 0, 1, 2, 3

\n

  • “Swift 不会遇到在循环内使用闭包的相同问题”这不是一个公平的比较,因为在 JavaScript 中你使用的是重复使用变量的常规 for 循环,但在 Swift 中你使用的是 `for.. in` 循环对变量进行新的迭代。如果您在 Swift 中使用常规 for 循环来重复使用该变量,则会出现相同的问题。 (2认同)