我看了越來越多的關於關門,而是我真的不明白它是什麼,從實際情況來看。我讀了維基百科頁面,但它並沒有真正爲我清楚什麼,因爲我有更多的編程(自學)實踐背景,而不是計算機科學背景。如果這是一個多餘的問題,我很抱歉,因爲我最初的搜索沒有得到任何真正爲我回答的東西。
編輯:感謝您指引我在正確的方向!我看到這個問題已經清楚地回答過了,所以我會解決這個問題。
我看了越來越多的關於關門,而是我真的不明白它是什麼,從實際情況來看。我讀了維基百科頁面,但它並沒有真正爲我清楚什麼,因爲我有更多的編程(自學)實踐背景,而不是計算機科學背景。如果這是一個多餘的問題,我很抱歉,因爲我最初的搜索沒有得到任何真正爲我回答的東西。
編輯:感謝您指引我在正確的方向!我看到這個問題已經清楚地回答過了,所以我會解決這個問題。
Eric Lippert's blog做了很好的解釋,在實際意義上。
也是如此Kyle at SO
的操作被說成在一組被關閉時該操作的結果也屬於該組。
例如 - 考慮一組正整數。加法是對這個集合的封閉操作,因爲添加兩個正整數總會給出一個正整數。
但是減法不關閉這個集合,因爲2 - 3會給-1,它不屬於正整數集合。
歡呼
兩個一句話總結:
•封閉是一個函數中的局部變量 - 更讓函數返回之後,或
•一個閉包是一個堆棧幀當函數返回時它不會被釋放。 (就好象一個「堆棧幀」被malloc分配而不是被堆棧上!)
可能最好通過一個例子顯示出
程序輸出(人工)前綴由*
的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
「現實世界的語言」是一個難以客觀衡量指標,但我會試試看,因爲畢竟我還缺少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
時通常會發生這種情況)。
內部函數(作爲結果返回)如何仍然引用外部函數的變量,因爲外部函數已完成?
答案正是這個「閉包」業務 - 內部(返回)函數可能仍然需要的外部函數中的那些變量被保留並附加爲返回的內部函數對象的屬性。
請參閱:http://stackoverflow.com/questions/36636/what-is-a-closure – Shog9 2009-07-05 04:00:26
因此,讓我們看看我是否能夠提取所有這些智慧:這是一個匿名的內部函數能夠訪問通常在執行時超出範圍的外部變量,但不是聲明? – MattC 2009-07-05 04:16:48