"現実世界の言語は、" 客観的に測ることが困難な尺度であるが、私'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
を使用すると通常どんなことが起こりますか)。
外部関数が終了しているので、内部関数(結果として返される)は引き続き外部関数の変数を参照できますか?
答えはまさにこの「クロージャー」ビジネスです。内部(返された)関数が必要とする可能性のある外部関数の変数は、返される内部関数オブジェクトの属性として保持され、添付されます。
参照:http://stackoverflow.com/questions/36636/what-is-a-closure – Shog9
私はこのすべての知恵を払拭することができたかどうかを確認できます。匿名の内部機能が可能な場合です通常は実行時にスコープ外になる外部変数にアクセスしますが、宣言はしませんか? – MattC