ホームページ  >  に質問  >  本文

JavaScript クロージャーはどのように機能しますか?

<p>JavaScript クロージャの概念 (関数、変数など) は理解しているが、クロージャ自体は理解していない人にクロージャを説明するにはどうすればよいでしょうか? </p> <p>ウィキペディアにあるスキームの例を見ましたが、残念ながら役に立ちませんでした。 </p>
P粉494151941P粉494151941393日前365

全員に返信(2)返信します

  • P粉734486718

    P粉7344867182023-08-23 09:30:55

    JavaScript では、各関数は外部の語彙環境へのリンクを維持します。字句環境は、スコープ内のすべての名前 (変数、パラメーターなど) とその値のマップです。

    したがって、function キーワードが表示されるたびに、その関数内のコードは関数の外部で宣言された変数にアクセスできます。

    リーリー

    関数 bar がパラメータ x と変数 tmp を閉じるため、これは 16 を出力します。これらは両方とも外部関数に存在します。 foo

    の字句環境内。

    関数 bar は、関数 foo

    の字句環境へのリンクとともに、クロージャを形成します。

    関数はクロージャを作成するために return

    を行う必要はありません。宣言だけで、各関数はそれを囲む字句環境を囲み、クロージャを形成します。

    リーリー

    #bar のコードは、パラメータ x と変数 tmp が直接参照されなくなっても参照できるため、上記の関数は 16 も出力します。範囲。

    ただし、tmpbar のクロージャ内にまだ存在するため、インクリメントできます。 bar が呼び出されるたびに増加します。

    クロージャの最も単純な例は次のとおりです:

    リーリー

    JavaScript 関数が呼び出されると、新しい実行コンテキスト ec が作成されます。関数パラメータとターゲット オブジェクトに加えて、この実行コンテキストは、呼び出し元の実行コンテキストの字句環境へのリンクも受け取ります。これは、外部字句環境で宣言された変数を意味します (上記の例では、a#)。 ## および b) には ec からアクセスできます。

    すべての関数には外部の字句環境へのリンクがあるため、すべての関数はクロージャを作成します。

    クロージャに表示されるのは変数そのものであり、コピーではないことに注意してください。

    返事
    0
  • P粉904405941

    P粉9044059412023-08-23 00:50:56

    クロージャは次のペアです:

    1. 関数と
    2. 関数の外部スコープ(字句環境)への参照

    字句環境はすべての実行コンテキスト (スタック フレーム) の一部であり、識別子 (つまり、ローカル変数名) と値の間のマッピングです。

    JavaScript のすべての関数は、外部の字句環境への参照を維持します。この参照は、関数の呼び出し時に作成される実行コンテキストを構成するために使用されます。この参照により、関数がいつどこで呼び出されるかに関係なく、関数内部のコードが関数の外部で宣言された変数を「参照」できるようになります。

    関数が別の関数によって呼び出される場合、外部の字句環境への一連の参照が作成されます。このチェーンはスコープ チェーンと呼ばれます。

    次のコードでは、inner は、foo が呼び出されたときに作成される実行コンテキストの字句環境を使用してクロージャを形成し、クロージャには変数 secret## が含まれています。 #:

    リーリー

    返事
    0
  • キャンセル返事