2009-07-05 8 views
4

可能性の重複:
What is a ‘Closure’?誰かが実際の言語でクロージャーを定義することはできますか?

私は閉鎖について、より多くのを読んで、私は実際にそれが実用的な観点からは何か得ることはありません。私はウィキペディアのページを読んでいますが、コンピュータサイエンスのバックグラウンドとは対照的に、プログラミングには実用的な背景がたくさんあるので、私にとっては何も明らかにしていません。これが冗長な質問であれば、私の最初の検索で本当にそれに答えるものは得られなかったので、謝罪します。

編集:正しい方向に私を指してくれてありがとう!私はこれが既に明確に答えられているのを見る前に、私は質問を終了します。

+1

参照:http://stackoverflow.com/questions/36636/what-is-a-closure – Shog9

+0

私はこのすべての知恵を払拭することができたかどうかを確認できます。匿名の内部機能が可能な場合です通常は実行時にスコープ外になる外部変数にアクセスしますが、宣言はしませんか? – MattC

答えて

1

操作は、その操作の結果はまた、そのセットに属するセットにわたって閉鎖されると言われません。

たとえば、 - 正の整数のセットを考えてみましょう。加算は、2つの正の整数を加算すると常に正の整数を与えるため、この集合に対する閉ループ演算です。

ただし、2 - 3は正の整数のセットに属しない-1を与えるため、減算はこのセットでは閉じられません。

歓声

+0

真実ですが、私はそれが彼が探していたタイプのクロージャーではないと思います。 –

+0

これは、線形代数と集合理論における閉包の定義です。彼が探していたのは、プログラミング言語におけるクロージャの定義です。 – Matthias

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

"現実世界の言語は、" 客観的に測ることが困難な尺度であるが、私'LL

多くの言語では、関数は複数の「スコープ」(グループ)を「見て」いるので、それを試してみてください。そのローカル変数と、それが入っているモジュールまたは名前空間の変数だけでなく、(別の関数内にある場合)その変数を含む関数のローカル変数も含みます。

たとえば、(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は、その含有関数outerが「範囲内」)(すなわち、「目に見える」をhaystackを有しているという理由だけで、引数としてそれを参照することなくhaystackを「見る」ことができます。これまでのところ、わかりましたが、私は望みます - これはまだ閉鎖についてではなく、字句の範囲についてです。

外部関数(ファーストクラスのオブジェクトとして機能する言語で、特にそれらが他の関数の結果として返されるようにする)では、外部関数は内部で呼び出す代わりにを返します(Pythonでは、例えば、デコレータ構文@somethingを使用すると通常どんなことが起こりますか)。

外部関数が終了しているので、内部関数(結果として返される)は引き続き外部関数の変数を参照できますか?

答えはまさにこの「クロージャー」ビジネスです。内部(返された)関数が必要とする可能性のある外部関数の変数は、返される内部関数オブジェクトの属性として保持され、添付されます。

関連する問題