うん、そうです。
そのコード サンプルでは、次のようになります。
- いくつかのプロパティを持つプレーン オブジェクトの定義
- プロパティ (関数) の 1 つの内部でクロージャを使用して、定義したばかりのオブジェクトを参照します。
グローバル スコープで定義するvar myWidget
場合でも、別の関数内で定義する場合でも、スコープ チェーンをたどって への参照を取得していることがわかりますmyWidget
。
ここでクロージャーのこの定義を使用すると、次のようになります。
A closure is a combination of a code block and data of
a context in which this code block is created.
またはモジラの定義:
Closures are functions that refer to independent (free) variables. In other words,
the function defined in the closure 'remembers' the environment in which it was created.
内部でコード ブロックを実行するときは、呼び出しで参照myWidget.init()
するためにクロージャーを使用し、コンテキスト/環境で変数を運ぶときに(関数内でローカルに見つけるのではなく)。myWidget
myWidget.left()
myWidget.right()
myWidget
init()
つまり、実行するmyWidget.init()
と次のことが起こります。
myWidget
現在の内部にローカル変数はありfunction()
ますか? いいえ
- 親スコープ (つまり、GLOBAL) に移動します。
- 変数は
myWidget
現在の (つまり GLOBAL) スコープ内にあるか? はい --> 閉鎖の使用法
- この
myWidget
参照を使用して変数を取得します。
グローバル スコープのクロージャについて考えたことはありませんでしたが、スコープ チェーンが GLOBAL まで移動し続けることは完全に理にかなっています。GLOBAL は、function() {}
すべてをラップする別のコード ブロックとして機能し、変数を見つけるための究極のソースです。その後、このビューをサポートする別の記事を次に示します。
http://lostechies.com/derickbailey/2011/11/30/is-javascripts-global-scope-really-just-a-closure/