2009-07-05 50 views
4

可能重复:
What is a ‘Closure’?有人可以定义真实世界语言中的闭包吗?

我看了越来越多的关于关门,而是我真的不明白它是什么,从实际情况来看。我读了维基百科页面,但它并没有真正为我清楚什么,因为我有更多的编程(自学)实践背景,而不是计算机科学背景。如果这是一个多余的问题,我很抱歉,因为我最初的搜索没有得到任何真正为我回答的东西。

编辑:感谢您指引我在正确的方向!我看到这个问题已经清楚地回答过了,所以我会解决这个问题。

+1

请参阅:http://stackoverflow.com/questions/36636/what-is-a-closure – Shog9 2009-07-05 04:00:26

+0

因此,让我们看看我是否能够提取所有这些智慧:这是一个匿名的内部函数能够访问通常在执行时超出范围的外部变量,但不是声明? – MattC 2009-07-05 04:16:48

回答

1

的操作被说成在一组被关闭时该操作的结果也属于该组。

例如 - 考虑一组正整数。加法是对这个集合的封闭操作,因为添加两个正整数总会给出一个正整数。

但是减法不关闭这个集合,因为2 - 3会给-1,它不属于正整数集合。

欢呼

1

两个一句话总结:

•封闭是一个函数中的局部变量 - 更让函数返回之后,或

•一个闭包是一个堆栈帧当函数返回时它不会被释放。 (就好象一个“堆栈帧”被malloc分配而不是被堆栈上!)

http://blog.morrisjohns.com/javascript_closures_for_dummies

1

可能最好通过一个例子显示出

程序输出(人工)前缀由*

的Javascript:

js> function newCounter() { 
    var i = 0;  
    var counterFunction = function() { 
     i += 1; 
     return i; 
    } 
    return counterFunction; 
} 
js> aCounter = newCounter() 
* function() { 
*  i += 1; 
*  return i; 
* } 
js> aCounter() 
* 1 
js> aCounter() 
* 2 
js> aCounter() 
* 3 
js> bCounter = newCounter() 
* function() { 
*  i += 1; 
*  return i; 
* } 
js> bCounter() 
* 1 
js> aCounter() 
* 4 
1

“现实世界的语言”是一个难以客观衡量指标,但我会试试看,因为毕竟我还缺少CS背景(这里是EE专业),而且有点自学;-)

在许多语言中,函数“看到”多个“范围”(组)的变量 - 不仅是它的局部变量,它所在的模块或名称空间的变量,还包括它所在函数的局部变量(如果它在另一个函数中)。

所以,例如(在Python中,但许多其他语言的工作类似!):

def outer(haystack): 

    def inner(needle): 
    eldeen = needle[::-1] 
    return (needle in haystack) or (eldeen in haystack) 

    return [x for x in ['gold','silver','diamond','straw'] if inner(x)] 

inner可以“看到” haystack无需查看它作为一个参数,只是因为它包含函数outer“范围内”具有haystack(即“可见”)。到目前为止,我很清楚,我希望 - 这还不是关闭,而是关于词汇范围界定。

现在假设外部函数(在语言处理函数作为第一类对象,特别是允许它们被作为其他功能结果返回)的外功能返回内层一个,而不是仅仅调用它内部(在Python中,例如,当您使用装饰器语法@something时通常会发生这种情况)。

内部函数(作为结果返回)如何仍然引用外部函数的变量,因为外部函数已完成?

答案正是这个“闭包”业务 - 内部(返回)函数可能仍然需要的外部函数中的那些变量被保留并附加为返回的内部函数对象的属性。