有人可以用现实世界的语言来定义闭包吗?

时间:2009-07-05 03:53:16

标签: closures

  

可能重复:
  What is a ‘Closure’?

我越来越多地了解了闭包,但从实际的角度来看,我并没有真正了解它。我阅读了维基百科页面,但它并没有真正清楚我的内容,因为我有更多的编程实践背景(自学)而不是计算机科学背景。如果这是一个冗长的问题,我道歉,因为我的初步搜索没有产生任何真正为我解答的东西。

编辑:感谢您指点我正确的方向!我之前已经清楚地回答过这个问题,所以我将结束这个问题。

5 个答案:

答案 0 :(得分:5)

Eric Lippert's blog在实际意义上解释这个问题做得非常好。

Kyle at SO

也是如此

答案 1 :(得分:1)

当该操作的结果也属于该组时,操作被称为关闭一组。

例如 - 考虑一组正整数。加法是对此集合的闭合运算,因为添加两个正整数将始终给出正整数。

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

欢呼声

答案 2 :(得分:1)

两句话摘要:

•闭包是函数的局部变量 - 在函数返回后保持活动状态,或

•闭包是一个堆栈帧,在函数返回时不会释放。 (好像'stack-frame'是malloc'ed而不是堆栈!)

http://blog.morrisjohns.com/javascript_closures_for_dummies

答案 3 :(得分: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

答案 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时通常会发生这种情况)。

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

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