グローバルスコープと、さらにネスト可能な機能スコープがあることを理解しています。しかし、Javascript には他のタイプのスコープやクロージャがありますか?
このトピックに取り組んでいますが、スコープとクロージャーの違いは何ですか?
グローバルスコープと、さらにネスト可能な機能スコープがあることを理解しています。しかし、Javascript には他のタイプのスコープやクロージャがありますか?
このトピックに取り組んでいますが、スコープとクロージャーの違いは何ですか?
クロージャは、可視スコープのスタックです。次のコードがあるとします。
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
たコール チェーンで返されると、このクロージャー バインディングが一緒に運ばれるため、b
a
f
f()
、グローバルスコープで関数を呼び出しているように見えても、これらすべてのスコープにアクセスできます。ご覧のとおり、関連するスコープはグローバル スコープと関数スコープの 2 種類だけです。主な違いは、グローバル スコープの変数はグローバル オブジェクトのプロパティとして定義されるのに対し、関数スコープの変数はオブジェクトのプロパティではなく、名前以外の方法で参照できないことです。クロージャはそれ自体がスコープではなく、スコープのコレクションです。