Kokudoriing

技術系与太話ブログ

スコープチェーンについて(2回目)

現在「ハイパフォーマンスJavaScript」読んでるわけですが。

ハイパフォーマンスJavaScript

ハイパフォーマンスJavaScript

すいません、前の記事間違ってました。

どうも Function オブジェクトは Scope という名前の内部プロパティ(JavaScript上からはアクセス出来ない)を持っているようで。
Scope プロパティがスコープチェーンという名前のオブジェクトを参照しているとのこと。

そして関数が呼ばれるたびに実行コンテキストというオブジェクトが生成され、
実行コンテキストは対応するスコープチェーンを生成。
そして各実行コンテキストに対応するアクティベーションオブジェクトと
グローバルオブジェクトが実行コンテキストのスコープチェーンに格納される。

その時に現在のアクティベーションオブジェクト→
(存在すれば)クロージャのアクティベーションオブジェクト→
...→
グローバルオブジェクト
という形で変数の名前解決が起きる。
だからクロージャは静的スコープでバインドされる。

また、実行コンテキストが自身のスコープチェーンを生成するときに、
実行コンテキストの元となる関数の Scope プロパティに格納されたオブジェクトを、
出現する順アクティベーションオブジェクトにコピーされる。
だからローカル変数は巻き上げを食らって宣言前に呼び出すと undefined になる。

そして、with文 はステート内のアクティベーションオブジェクト(っぽいもの)を生成し、
呼び出し元の実行コンテキストのスコープチェーンの1番目に差し込んでいたんですね。
ちなみに、このようにスコープチェーンを拡張する働きがあるのは with文 の他だと catch節 もそうだとか。


…びっくりするほど前の説明と違いましたね(テヘペロ
いや、本当にすみません、初めて知りました。
大学の講義中にこの本読んでて、びっくりして「えっ」って呟いて周りから白い目で見られたりしました。

そして多分この説明だとしっくりこないと思います。
詳しく知りたい方は「ハイパフォーマンスJavaScript」を読みましょう!
無駄にディープです。濃いです。
正規表現のボトルネックの話(バックトラッキングを意識する云々)が一番わけわかんなかった(小並感)