71

closureクロージャーとは何かは理解していますが、この用語が何を指しているのかを正確に把握するのに苦労しています。多くの Web サイトでこの用語が使用されているのを見てきましたが、実際の定義について同意していることはめったにありません。

  • スタックフレームに保持されているのは変数ですか?
  • 返されているのは関数ですか?
  • 外部関数のスコープですか?
  • 内部(返される)関数のスコープですか?
  • 関数を返した後、変数をスタックフレームに保持するという概念でしょうか?

closure誰かが何を指しているのか正確に教えてもらえますか?

4

8 に答える 8

45

JavaScript クロージャから

2 つの 1 文の要約:

クロージャーは、関数のローカル変数であり、関数が戻った後も存続します。または

クロージャーは、関数が戻るときに割り当てが解除されないスタック フレームです。(あたかも「スタック フレーム」がスタック上にあるのではなく、malloc されたかのように!)

閉鎖に関する非常に良い記事

Javascript クロージャー

「クロージャー」とは、自由変数をそれらの変数をバインドする (式を「閉じる」) 環境と一緒に持つことができる式 (通常は関数) です。

Closure の簡単な説明は、ECMAScript が内部関数を許可するということです。他の関数の関数本体内にある関数定義と関数式。また、これらの内部関数は、外部関数内のすべてのローカル変数、パラメーター、および宣言された内部関数にアクセスできます。これらの内部関数の 1 つが、それが含まれていた関数の外部でアクセス可能になると、クロージャが形成され、外部関数が戻った後に実行できるようになります。その時点で、ローカル変数、パラメーター、および外部関数の内部関数宣言にアクセスできます。それらのローカル変数、

ここの良い例

JavaScript、クロージャを理解するまでの時間

于 2009-11-26T06:57:47.080 に答える
6

これは、別のスコープ内の何かへの参照を「保持」する関数です。例えば:

var myArrayOfFunctions = [];

for(var i = 0; i<3: i++)
{
    //Note how the function being defined uses i, 
    //where i lives in the parent's scope, this creates a closure
    myArrayOfFunctions[i] = function(a) { return a + i;}    
}

myArrayOfFunctions[0](5);   //Prints 8 WTF!
myArrayOfFunctions[1](5);   //8 again
myArrayOfFunctions[2](5);   //Well, this 8 was expected

これは、関数が「作成」されるときに i の値をコピーせず、i への参照を保持するため、関数を呼び出すときに i の現在の値である 3 を使用するために発生します。

グラフによる説明はこちら。

于 2009-11-26T07:09:09.833 に答える
4

私にとって、JSのクロージャを使用すると、次のことが可能になります。
「a」は、外部で宣言されていますが、「b」に追加された場合、内部関数で引き続き使用できます。

function adder(a){
  return function(b){
    return a + b;
  };
}
var add5 = adder(5);
alert( add5(10) );

JSクロージャの極端な使用法については、PUREライブラリ(JSテンプレートエンジン)のソースコードを参照してください。

于 2009-11-26T16:44:31.387 に答える
2

私の知る限り、クロージャーは、親関数のスコープを超えて存続する別の関数内で定義された関数です。一般的な例はコールバックです:

function delay_message(msg)
{
     setTimeout(function closure() { alert(msg); }, 1000);
}

この場合、上記function closureは の本体内で定義されていますdelay_messageが、関数定義 (および親関数の変数) は、関数呼び出しmsgのスコープを超えて存続します。delay_message

于 2009-11-26T06:59:18.060 に答える
1

クロージャは、ネストされた関数宣言または関数式 (つまり、ラムダ式) から作成された関数値であり、その本体には、外側の (しかしグローバルではない) スコープで宣言された変数への参照が 1 つ以上含まれています。

于 2011-03-20T01:09:47.910 に答える
1

基本的に、クロージャーは、ローカル環境内の識別子 (変数) に対して閉じられた関数本体です。

于 2009-11-26T16:50:11.210 に答える