スコープチェーン(scope chain)

1539 ワード

役割をよく理解するために、まず準備をします.
1.スコープ
JavaScriptでは、現在のスコープおよびネストされている副作用領域において、エンジンがどのようにして識別子(ここの識別子は変数名または関数名を意味する)の名前に基づいて変数検索を行うかを管理するために、スコープを規則セットとして定義することができます.javascriptにおけるスコープは大域作用域と局所作用域の2種類があり、局所作用域は関数作用域とも呼ばれる.
グローバルスコープ
コードのどこにでもアクセスできるオブジェクトは、グローバルスコープを持っています.
var a = "tsrot";
function hello(){
    alert(a);
}

function sayHello(){
    hello();
}

alert(a);     //    tsrot
hello();      //    tsrot
sayHello();   //    hello  ,       tsrot
ローカルスコープ(関数スコープ)
ローカルスコープは関数内で作成され、関数内でアクセスできます.関数外ではアクセスできません.
function hello(){
    var a = "tsrot";
    alert(a);
}

hello(); //       tsrot
alert(a); //error not defined
スコープチェーン
関数は、起動時に対応する実行コンテキストの作成を開始します.コンテキスト生成を実行する過程で、変数オブジェクト、作用ドメインチェーン、およびthisの値はそれぞれ決定されます.
アクティブドメインチェーンは、現在の環境と上位環境の一連の変数オブジェクトから構成され、アクセス権限に適合する変数と関数に対する現在の実行環境の規則的なアクセスを保証します.スコープチェーンは、関数実行時にどのような順序で必要な変数にアクセスするかを示しています.
var a = 20;

function test() {
    var b = a + 10;

    function innerTest() {
        var c = 10;
        return b + c;
    }

    return innerTest();
}

test();
上記の例では、大域、関数test、関数innerTestの実行コンテキストが前後して作成されている.彼らの変数の対象をそれぞれVO(global),VO(test),VO(innerTest)と設定します.innerTestのロールドメインチェーンは、これらの3つの変数オブジェクトを同時に含んでいるので、innerTestの実行コンテキスト生成のロールドメインチェーンは、以下のように表されてもよい.
VO(innerTest) ==> VO(test) ==> VO(global)
まずVO(innerTest)の中にcがありますが、bが見つからないので、VO(test)の中にbがあります.最後に大域VO(global)の中にaすなわち関数が見つけられます.アクセス変数の時に、先に現在実行中の文脈を探します.見つけられなくて、大域文脈まで探します.