次のクロージャー問題を参照してください
リーリー出力は 20 ではなく 10 です。x が値を取得するとき、スコープ チェーンに沿って検索していませんか? 関数の作成時にスコープ チェーンが決定されている場合、結果は 10 になります。関数が呼び出されたときに決定され、20 になるはずです。スコープ チェーンに関する正確な記述はありますか?ここでの正確なスコープチェーンはどのようにあるべきでしょうか? fn と show は同じレベルですか、それとも fn は show 内にありますか?
欧阳克2017-07-05 10:44:15
スコープチェーンは関数の定義時に決定されます。
変数は関数のドメイン内でのみ定義されるため、関数内で定義された変数には関数の外部からはアクセスできません。同様に、関数は、そのスコープ内で定義された任意の変数および関数にアクセスできます。つまり、グローバル スコープで定義された関数は、グローバル スコープで定義されたすべての変数にアクセスできます。別の関数内で定義された関数は、その親関数で定義されたすべての変数、および親関数がアクセスできるその他の変数にもアクセスできます。
https://developer.mozilla.org...
習慣沉默2017-07-05 10:44:15
スコープチェーンは動的であるため、呼び出し時に決定されます。
しかし、あなたのコードでは、クロージャによって定義された function() はバインディングの最も外側のスコープです
function によって宣言された関数は、デフォルトでバインディングの最も外側のスコープになります
(私も勉強中です…)
PHP中文网2017-07-05 10:44:15
関数の作成時にグローバル変数オブジェクトを含むスコープ チェーンを作成し、それを内部の [[Scope]] 属性に保存します。関数が実行されると、[[Scope]] 属性内のオブジェクトをコピーすることによって実行環境が作成され、実行環境のスコープ チェーンが構築され、独自のアクティブ オブジェクトがフロントエンドにプッシュされます。スコープ チェーンを使用して完全な関数を形成します。 [[Scope]] は、値のコピーではなく、グローバル変数への参照を保持します。
リーリー阿神2017-07-05 10:44:15
クロージャの呼び出しメソッドは次の効果と同等です。以下の例は、スコープチェーンが関数定義時の位置に関連していることを比較して示しています。
リーリー関連する質問のリンクを追加しました。 /q/10…。スコープチェーンについての議論があります。