スキャン


それは何ですか。


スコットランド識別子は有効範囲です.簡単に言えば、識別子は変数、関数、クラスなどの名前であり、有効範囲がある.そのため、同じ名前でもスコフが違うと使えます.
scopeにはグローバルscopeとゾーンscopeがあり、グローバルscopeはその名の通り識別子の有効範囲がグローバルである.すなわち、グローバルスキャンを有するグローバル変数は、どこでも呼び出すことができる.逆に、領域スキャン(localscope)は、識別者の有効範囲が特定の領域に限られている.すなわち,領域スキャンを持つ変数はその領域(+サブ領域)のみ有効であり,他の場所から領域変数を呼び出すことはできない.

Scope chain


スキャンミラーには階層があります.すなわち、グローバル範囲内でサブ範囲を作成してもよいし、サブ範囲内でサブ範囲を作成してもよい.このように、グローバルスキャンからオーバーラップしたスキャン順序が接続されたものをスキャンチェーンと呼ぶ.
グローバルスキャン機能を持つグローバル変数は、スキャン機能が変換されたため、どこでも呼び出すことができます.コード実行中に参照変数のコードに遭遇した場合、JavaScriptエンジンは現在の状態でその変数を検索し、そうでない場合は親状態での検索を続行します.もちろん、検索の最後はグローバルスキャンなので、グローバル変数はどこでもアクセスできます.しかし,重要なのは,スコフ鎖が一方向であることである.常にサブスキャンで親スキャンのみを行います.

どうやって作ったの?


では、スコフはどんな状況で分けたのでしょうか.デフォルトでは、関数を宣言すると、関数のみのスキャン(領域スキャン)が生成されます.ではif moon,while moon,for moonのようなブロックでは?変数がES 5を使用するvarとして宣言された場合、変数のスキャンは関数レベルでのみ決定されます.すなわち,条件文や繰返し文のブロックは独立したscopeとして認定されず,関数外のブロックでvarと宣言された変数がグローバル変数となる.ただし、その後追加されるconst、letについては、ブロックレベルスキャンが認められる.
では、いつが標準ですか.本のサンプルコードは以下の通りです.
const x = 1;

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

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

foo(); 
bar();
bar関数はxという変数を出力します.では、バーで言ったxは誰ですか.まず,barにはxがないので,位相走査からxを探索する必要がある.では、バーの大尉スコフは誰ですか.
位相走査を決定する方法は動的走査と静的走査の2種類がある.動的走査とは,位相走査が関数呼び出しの場所によって決定される方式である.このようにfoo()を実行すると出力10が出力される.静的スキャンとは、関数宣言時に決定される方法です.このように、関数宣言時にbarの親スキャンはグローバルであるため、foo()を実行すると1が出力される.
JavaScriptは静的スキャン方式を使用します.ウィキペディアによれば、ほとんどの言語は静的スキャン方式であり、一部のLispの方言、一部のスクリプト言語またはテンプレートは動的スキャン方式を使用する.(論文作成時によく使われるLaTexはダイナミックスキャン方式とも呼ばれる.)要するにjavascriptは静的スキャン方式であるため,関数を宣言する際の状況を記憶することができ,複製が可能となる.