まず、静的スコープとは、言語におけるスコープ(アクセス可能な範囲)を指す言葉です。
別名でLexical Scopeとも呼ばれていて「プログラムを記述した時点でスコープが決まる」言語体系を指します。
次に、クロージャとは、ご理解のとおり関数外の変数を関数内で操作できる仕組みの事です。
Javascriptにはスコープ連鎖とプロトタイプ連鎖の2つがあります。
これらはいずれも「最初に自身のメンバを探索し、なければ上位層へと探索を進める仕組み」で、
それぞれ探す場所が異なります。
- スコープ連鎖:Activation Object(関数スコープ)に対する連鎖
- プロトタイプ連鎖:Function.Prototypeに対する連鎖
代表例として以下のような順序で探索していきます。
- Inner functionのスコープ
- Inner functionのプロトタイプ
- Outer functionのスコープ
- Outer functionのプロトタイプ
- グローバルスコープ
つまり、スコープ→プロトタイプの順番に内→外に連鎖しているということですね。
このように一番近いオブジェクトを参照するための仕組みを「Masking」と呼びます。
「グローバル>Outer>Inner」のように階層ごとに同名の変数を定義できる仕組みを「Shadowing」と呼びます。
上記で触れている「アクティベーションオブジェクト」は、関数自体をオブジェクト化した際に付随する情報です。
以下のような構造体を想像してください。
- arguments(呼び出し元の情報)
- this(自身の情報)
- variables(メンバとなる変数情報)
上記を理解するには、以下のリンクが参考になるかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。