0

たとえば、JavaScriptでレキシカルスコープがどのように行われているかについて、私はちょっと混乱しています。

function outer(){
    a = 5;
    function inner(){
        console.log(a);
        var a = 10;    //hoisting
    }
    inner();
}
outer();

a5 行目で再定義すると、 が出力されますundefined。何故ですか?で見つけることができるにouter.VOもかかわらず、インタプリタがトラバースアップしてチェックしないのはなぜですか?定義される前に使用されていますか?ainner.VO

4

1 に答える 1

3

私が覚えている限りでは、巻き上げるとそのinner関数は次のように解釈されます。

function inner(){
    var a;
    console.log(a);
    a = 10;
}

したがって、10 に代入すると、関数内のステートメントにあるaの定義が見つかるまでスコープが検索されます。その外に出る必要がないので、関数内の が存在しないように動作します。また、が実行されると、デフォルトで に設定されます。そのため、出力を表示しています。avarinneraoutervar a;aundefinedundefined

これについて説明します。Javascript インタープリターは、関数に遭遇したときに次のことを行います (これは実行コンテキストと呼ばれます)。

a: undefined 
inner : pointer to function

2-関数のスコープチェーンと「this」の値を定義します

B-コード実行ステージコードを1行ずつ実行します

まだ宣言されていない関数の呼び出しに遭遇した場合は、それを実行します。

    inner : pointer to function

宣言の前に inner() を呼び出した場合は問題ありませんが、無名関数では機能しません。

任意の変数のように扱われるため

fn();
var fn = function () {..}

変数オブジェクトがそのようになるため、これは機能しません

fn: undefined 
于 2013-07-08T21:09:45.210 に答える