2014-07-10 55 views
2

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

所以,在Javascript此代码的工作:

var outside = 5; 
function test() { 
alert(outside); // returns 5 
} 

这是否意味着斯威夫特,如果我以任何可能的方式创建关闭,这将在相同的范围身在何方关闭访问所有本地变量被创建?

(我看的closure in programming维基百科的定义,但感觉太模糊了 - 特别是,什么样的价值观是闭合保持跟踪)

+0

维基的定义对我来说似乎很清楚 - “闭包是一个函数或对函数的引用以及引用环境 - 存储对该函数的每个非局部变量(也称为自由变量或向上值)的引用的表。闭包 - 与普通函数指针不同 - 允许函数访问那些非局部变量,即使在其直接词法作用域之外调用时也是如此。“ – elclanrs

+0

在那个JS示例中,不是”局部变量“是局部变量,但是? – Rudi

+0

@ Rudi本地到外部函数(包含您显示的所有代码的函数),但不是本地到'test'。 – delnan

回答

0

斯威夫特关闭捕捉局部变量,以便满足您的“水晶球只能同行它在哪里创建“的要求。

var funcs: [()->()] = [] 

for i in 0...3 { 
    funcs += { 
    println(i) 
    } 
} 

for i in 0...3 { 
    println(funcs[i]()) 
} 

生成结果0,1:因为在作用域的差的

,夫特不使用环内封闭件的相同的问题

JavaScript closure inside loops – simple practical example

的夫特等效遭受,2 3

+1

*“...不像JavaScript封闭可以定义为匿名函数......”* JavaScript匿名函数(所有的JS函数)创建一个闭包。 –

+1

@cookiemonster非常好的一点。我的意思是Swift中的闭包不需要'fund'或'function'关键字,所以更简洁 – ColinE

+0

啊,是啊JS函数语法是冗长的...... [现在](http://wiki.ecmascript.org/ doku.php ID =和谐:arrow_function_syntax)。 :-) –