13.スコフ-モダンJavaScript DeepDive


第13章
13.1スコフラン?
各識別子には有効な範囲があり、他のコードは、宣言された場所に基づいて識別子を参照できます.
識別子は有効範囲のルールを検索します.
var x = 'global';

function foo() {
  var x = 'local';
  console.log(x); // ①
}

foo();

console.log(x); // ②
上記のようにjavascriptエンジンは、2つの変数でどの変数を参照するかを決定する必要があります.
上のxはscopeとは異なるもう一つの変数です.識別子を検索する際に用いられるルールともいえる.
13.2スキャンタイプ
コードは、グローバルとゾーンに分割できます.
パーティション説明scope変数グローバルコードの外部領域グローバルscopeグローバル変数領域関数本体内部領域scope領域変数
この場合、変数は宣言された位置によって決定されます.

13.2.1地域および地域スキャン
グローバルとは、コードの最も外側の領域を指します.戦区製造戦区スキャン.グローバル変数は、内部変数を含む任意の場所で参照できます.
13.2.2地域および地域スキャン
領域とは、関数体の内部を指します.領域変数は、自分の領域スキャンとサブ領域スキャンで有効です.
13.3チェーン
関数はオーバーラップしてもよく、関数の領域スキャンはオーバーラップしてもよい.これは、copeが関数の重なりによって階層を有し、重なり関数の領域copeと重なり関数を含む外部関数の領域copeが階層を有することを意味する.
これにより、すべてのスキャンは1つの階層で接続され、すべての地域スキャンの最上位はグローバルスキャンです.
スケッチャーが階層的に接続されているものをスケッチャーチェーンと呼びます.
変数を参照する場合、JavaScriptエンジンは、参照変数のコードのスキャンからスキャンチェーンを介して、宣言された変数を上方向に移動して検索します.

これは、親鏡で有効な変数は子鏡で自由に参照でき、子鏡で有効な変数は親鏡で参照できないことを意味します.継承に似ています!
13.4関数レベルスキャン
領域は関数体の内部を指し、領域は領域スキャンを指す.これは、非コードブロックの関数のみによって領域スキャンが生成されることを意味する.
var keywardorが宣言した変数は、関数のコードブロックのみを承認します.この特性を関数レベルエンコーダと呼ぶ.次の例に示すように、グローバル変数の値が再割り当てされます.
var x = 1;

if (true) {
  // var 키워드로 선언된 변수는 함수의 코드 블록(함수 몸체)만을 지역 스코프로 인정한다.
  // 함수 밖에서 var 키워드로 선언된 변수는 코드 블록 내에서 선언되었다 할지라도 모두 전역 변수다.
  // 따라서 x는 전역 변수다. 이미 선언된 전역 변수 x가 있으므로 x 변수는 중복 선언된다.
  // 이는 의도치 않게 변수 값이 변경되는 부작용을 발생시킨다.
  var x = 10;
}

console.log(x); // 10
13.5電子顕微鏡
var x = 1;

function foo() {
  var x = 10;
  bar();
}

function bar() {
  console.log(x);
}

foo(); // ?
bar(); // ?
上記の例の実行結果はbar関数の親スキャンが何であるかによって異なります.
  • 関数はどこから呼び出され、関数の親スキャンを決定します:
  • 関数はどこで定義され、関数の親スキャン:
  • を決定します.
    1つ目の方法はダイナミックスキャンと呼ばれます.これは、関数を呼び出すときに親スキャンを動的に決定するためです.
    第2の方法は、Lexical Scoperまたは静的Scoperと呼ばれる.関数定義は評価時に決定されるため、JavaScriptを含む多くのプログラミング言語はディレクトリに従う静的と呼ばれます.
    関数呼び出しの場所は、LexicalScopeに従うため、親スキャンの決定には影響しません.すなわち,関数の位相スケールは常に自己定義のスケールである.
    関数定義を実行して生成された関数オブジェクトは、このように決定された親スキャンを覚えています.関数を呼び出すたびに、関数の親スキャンを参照する必要があるためです.