0

グローバルスコープと、さらにネスト可能な機能スコープがあることを理解しています。しかし、Javascript には他のタイプのスコープやクロージャがありますか?

このトピックに取り組んでいますが、スコープとクロージャーの違いは何ですか?

4

1 に答える 1

2

クロージャは、可視スコープのスタックです。次のコードがあるとします。

var v1;
function a() {
    var v2;
    function b() {
        var v3;
        function c() {
            var v4;
        }
        return c;
    }
    return b();
}
var f = a();

cは、4 つの可視スコープを持つ関数です: 独自のスコープ (v4が定義されている場所)、b関数のスコープ (v3が定義されている場所)、a関数のスコープ (v2が定義されている場所)、およびグローバル スコープ (v1が定義されている場所)。可視スコープのスタックがクロージャーであり、関数はそのクロージャーにバインドされています。関数への参照が からに呼び出され、最後に に割り当てられcたコール チェーンで返されると、このクロージャー バインディングが一緒に運ばれるため、baff()、グローバルスコープで関数を呼び出しているように見えても、これらすべてのスコープにアクセスできます。ご覧のとおり、関連するスコープはグローバル スコープと関数スコープの 2 種類だけです。主な違いは、グローバル スコープの変数はグローバル オブジェクトのプロパティとして定義されるのに対し、関数スコープの変数はオブジェクトのプロパティではなく、名前以外の方法で参照できないことです。クロージャはそれ自体がスコープではなく、スコープのコレクションです。

于 2012-09-22T12:06:31.627 に答える