JavaScriptの実行環境とスコープ


実行環境はJavaScriptの中で最も重要な概念です.
  • 実行環境
  • 実行環境は、変数や関数がアクセスできる他のデータを定義し、それぞれの挙動を決定します.
    各実行環境には、関連する変数オブジェクトがあります.環境で定義されているすべての変数と関数は、このオブジェクトに保存されます.私たちは見えませんが、データを処理する時には後でそれを使います.
  • グローバル実行環境
  • グローバル実行環境は、最も周辺的な実行環境である.ECMAScriptによる宿主環境の実現によって、実行環境を示す対象が異なります.
    Webブラウザでは、グローバル実行環境はwindowオブジェクトであるため、すべてのグローバル変数と関数はwindowオブジェクトの属性と方法として作成されます.アプリケーションが終了するまでは、例えばウェブページやブラウザを閉じます.
  • 作用分域チェーン
  • 各関数は自分の実行環境を持っています.実行ストリームが関数に入ると、関数の環境が環境スタックに押し込まれます.関数が実行された後、スタックはその環境をイジェクトし、制御権を前の実行環境に戻す.コードが環境で実行されると、変数オブジェクトのスコープが作成されます.
    作用するドメインチェーンの用途は、実行環境にアクセスできるすべての変数と関数に対する規則的なアクセスを保証することである.
    スコープの先端は、常に現在実行されているコードのある環境の変数オブジェクトです.この環境が関数である場合、その活動対象を変数オブジェクトとします.活動対象は最初に一つの変数だけを含んでいます.つまり、argmentオブジェクト(このオブジェクトはグローバル環境には存在しません.)フィールドチェーンの次の変数オブジェクトは、含まれる環境から来ます.次の変数オブジェクトは次の環境から来ます.このようにして、グローバル実行環境に至るまで継続します.グローバル実行環境の変数オブジェクトは常にフィールドチェーンの最後のオブジェクトです.
  • 識別子の解析
  • 識別子解析は、ロールチェーンに沿って識別子を1段階ずつ検索するプロセスである.検索プロセスは常に、ドメインチェーンの先端から始まり、識別子が主であることが分かるまで、段階的に後へ遡る.識別子が見つからないと、通常エラーが発生します.
    var color = 'blue';
    function changeColor() {
        if (color === 'blue') {
            color = 'red';
        } else {
            color = 'blue';
        }
    }
    
    changeColor();
    console.log('now Color is: ' + color); // now Color is: red
    は、この例では、関数changeColorのスコープチェーンは、自身の変数オブジェクトとグローバル環境の変数オブジェクトとを含む2つのオブジェクトを含む.関数内部で変数カラーにアクセスできるのは、このスコープ内で見つけられるからです.
    各環境は、変数と関数名を調べるために、作用するドメインチェーンを上に検索することができます.しかし、任意の環境は、ドメインチェーンを下に検索することによって、他の実行環境に入ることはできません.
  • ブロックレベルの作用領域がない
  • 他の種類のCの言語では、かっこで閉じられたコードブロックは、自分の役割領域(ブロックレベルの役割領域と略称する)があります.しかし、JavaScriptはブロックレベルのスコープがなく、条件によって変数を定義することができません.
    if(true) {
        var color = 'blue';
    }
    
    console.log(color); // blue
    は、この例では、if文で変数カラーを定義している.クラスCの言語では、カラーはif文の実行後に破棄されます.ただし、JavaScriptでは、if文の変数宣言は、現在の実行環境(ここではグローバル環境)に変数を追加します.