[JavaScript]スキャン


スキャン
Scopeは識別子の有効範囲です.任意の境界Aの外部からアクセスすることも、Aの内部からアクセスすることもできますが、Aの内部で宣言された変数はAの内部からのみアクセスできます.
かんすうそういん
これらのスキャンの概念はほとんどのプログラミング言語に存在するが、ES 5までのjavascriptはグローバル空間でない限り関数によって生成されるだけである.これらのスケールを関数スケールと呼びます.
ブロックミラー
幸いなことに、ES 6では、ブロックもスキャン境界を生成し、他の言語と似ています.これらのスケールはブロックスケールと呼ばれ、関数スケールを区別するために使用されます.
これらのブロックはvarキーワードとして宣言された変数のみに作用し、新しく作成されたlet、const、class、strict modeの関数宣言などには処理者のみの役割を果たします.
ひょうじチェーン
内から外へ順に識別子を検索する有効範囲をスキャンチェーンと呼ぶ.
LexicalEnvironmentの2番目の収集資料outher-EnvironmentReferenceはこれらのスキャンチェーンを可能にした.
変数可変シャドウの非表示
一方,scopeチェーン上の変数であるため,必ずしもアクセスできるわけではない.グローバル空間で宣言された識別子が関数で宣言された識別子名と同じである場合、関数で宣言された識別子が使用されるため、グローバル空間で宣言された同名の識別子にはアクセスできません.
この現象を変数隠匿化と呼ぶ.
スキャンチェーンの確認
クロムブラウザ環境では、開発者ツールのコンソールウィンドウから、現在実行中のコンテキスト以外のすべてのトップスキャン情報を表示できます.関数の内部出力時にチェックします.
var a = 1;
var outer = function() {
  var b = 2;
  var inner = function() {
    console.log(b);
    console.dir(inner);
  };
  inner();
};
outer();
デバッガを使用すると、情報をよりよく表示できます.console.dir()ではなくdebuggerに変更すればよい.
var a = 1;
var outer = function() {
  var b = 2;
  var inner = function() {
    console.log(b);
	debugger;
  };
  inner();
};
outer();