scope chain

いまさらながらスコープとスコープチェーンの話。スコープチェーンについて分かったつもりになっていたのですが以下のサンプルコードのfooの値は○○○だ!って思ってたけど違った。

foo = 'hoge';
function hoge(){
    var foo = 'foo';
    function foo(){};
    alert(foo); // ???
};
hoge();

scope chainとLEGBルール*1

ECMAScript仕様書にはscope chainという用語で説明されている、要はスコープをどうやって探していくかの順番の定義。図にまとめると以下のような具合。
初めてのPythonではPythonのスコープ検知の順番をLEGBルールとして紹介している。Lはローカルスコープ。Eはエンクロージングファンクションズスコープ(JavaScriptで単にクロージャと呼ばれている。)。Gはグローバルスコープ。Bはビルトインスコープ。JavaScriptも同様に L → E → G → B の順番で検索される。

with句とscope chain

上記で説明したscope chainのルールを書き換えるのがwith句。詳しくは言及せず。

*1:初めてのPythonより借用