スキャン
10517 ワード
poiemawebを参照
スキャン識別子の有効範囲 他のコード参照変数自体の範囲 JavaScriptエンジン識別子検索時に使用するルール 識別子変数名の競合を防止する .
関数のみで生成され、グローバルスペースは含まれません(varキーワードを使用する識別子のみ) コードの一番外側の領域:グローバル 関数内部:地域 ex)関数のパラメータは、関数本体内部でのみ参照でき、外部では参照できません
変数xを参照する場合は、Scopeを内から外へ順に検索し、宣言した変数を最近の場所で参照します.従ってfoo関数内部
最後の行のグローバル空間では、
これによりjavascriptエンジンは、スキャンによってどの変数を参照すべきかを決定できます.
ゾーンスキャン
領域とは、関数体の内部を指します.ゾーン作成ゾーン範囲(localscope).領域に変数を宣言すると、領域スキャンを持つ領域変数(localvariable)になります.領域変数は、宣言された領域とサブ領域(オーバーラップ関数)でのみ参照できます.すなわち,領域変数は自分の領域スキャンとサブ領域スキャンで有効である.自分が主張する地域の上位ミラーの下では,自分の変数を参照することはできない.すなわち,外部関数は内部関数で宣言された変数を参照できない.(letとconstキーを使用する変数は適用されません)
ひょうじチェーン
関数は、グローバルで定義することも、関数ボディの内部で定義することもできます.関数体の内部で定義されている関数を「関数の重ね合わせ」と呼びます.一方、関数体の内部で定義されている関数は「ネスト関数」と呼ばれ、ネスト関数を含む関数は「外部関数」と呼ばれます.
オーバーラップ関数の領域スキャンとオーバーラップ関数を含む外部関数の領域スキャンには階層があります.このとき,外部関数の領域走査を重畳関数の位相走査とする.
内から外へ順に識別子を検索する有効範囲をスキャンチェーンと呼ぶ.
outer関数の
参照する変数が自分の範囲内でない場合は、親の範囲内でナビゲートします.
親スキャンマップにもない場合は、次の親スキャンマップをナビゲートし、スキャンチェーン上で順次ナビゲートし、最初に発見された識別子にアクセスして参照します.
(サブスキャンにアクセスせずに親スキャン方向にナビゲートする必要があります.)
かんすうレベルそうさ
varキーワードとして宣言された変数は、関数のコードブロック(関数体)が領域コードであることのみを認めます.これらの特性を関数レベルスキャン(functionlevelscope)と呼ぶ.
でんしけんびきょう
JavaScriptはLexical Scopeに従うため、関数がどこから呼び出されるかではなく、関数がどこで定義されるかに基づいて親Scopeを決定します.関数呼び出しの場所は、親スキャンの決定には影響しません.すなわち,関数の位相スケールは常に自己定義のスケールである.
この関数の位相走査は,関数定義運転時に静的に決定される.関数定義(関数宣言または関数式)を実行して生成された関数オブジェクトは、このように決定された親スキャンを記憶します.関数を呼び出すたびに、関数の親スキャンを参照する必要があるためです.
スキャン
関数のみで生成され、
function add(x, y) {
// 매개변수는 함수 몸체 내부에서만 참조할 수 있다.
// 즉, 매개변수의 스코프(유효범위)는 함수 몸체 내부다.
console.log(x, y); // 2 5
return x + y;
}
add(2, 5);
// 매개변수는 함수 몸체 내부에서만 참조할 수 있다(함수 외부에서는 유효하지 않기때문)
console.log(x, y); // ReferenceError: x is not defined
変数は、宣言された位置によって独自の有効範囲を決定します.すなわち、他のコードは変数自体の範囲を参照できます.変数だけでなく、すべての識別子です.すなわち、すべての識別子(変数名、関数名、クラス名など)は、宣言された位置によって、他のコード参照識別子自体の有効範囲を決定する.それをひっくり返す.すなわち,スキャンは指標識別子の有効範囲である.var x = 'global';
function foo() {
var x = 'local';
console.log(x); // 'local'
}
foo();
console.log(x); // 'global'
変数xは、変数名が同じであるがscopeが異なるため、グローバルおよびfoo関数内でそれぞれ宣言される.変数xを参照する場合は、Scopeを内から外へ順に検索し、宣言した変数を最近の場所で参照します.従ってfoo関数内部
console.log(x)
のx変数は「local」値を参照する.最後の行のグローバル空間では、
console.log(x)
のx変数は、グローバルスキャンで宣言されたxを参照する.これによりjavascriptエンジンは、スキャンによってどの変数を参照すべきかを決定できます.
ゾーンスキャン
領域とは、関数体の内部を指します.ゾーン作成ゾーン範囲(localscope).領域に変数を宣言すると、領域スキャンを持つ領域変数(localvariable)になります.領域変数は、宣言された領域とサブ領域(オーバーラップ関数)でのみ参照できます.すなわち,領域変数は自分の領域スキャンとサブ領域スキャンで有効である.自分が主張する地域の上位ミラーの下では,自分の変数を参照することはできない.すなわち,外部関数は内部関数で宣言された変数を参照できない.(letとconstキーを使用する変数は適用されません)
ひょうじチェーン
関数は、グローバルで定義することも、関数ボディの内部で定義することもできます.関数体の内部で定義されている関数を「関数の重ね合わせ」と呼びます.一方、関数体の内部で定義されている関数は「ネスト関数」と呼ばれ、ネスト関数を含む関数は「外部関数」と呼ばれます.
オーバーラップ関数の領域スキャンとオーバーラップ関数を含む外部関数の領域スキャンには階層があります.このとき,外部関数の領域走査を重畳関数の位相走査とする.
内から外へ順に識別子を検索する有効範囲をスキャンチェーンと呼ぶ.
// 전역 공간
var a = 1;
var outer = function() { // 외부 함수
var inner = function() { // 내부 함수
console.log(a);
var a = 3;
};
inner();
console.log(a);
};
outer();
console.log(a);
// 출력:
// undefined
// 1
// 1
// 계층 구조
// inner 지역 스코프 -> outer 지역 스코프 -> 전역 스코프
上のコードのスキャンチェーンは、トップスキャンベースのグローバルスキャン、グローバル宣言outer関数の領域スキャン、outer関数内部宣言のinner関数の領域スキャンから構成されます.outer関数の
console.log(a);
は、グローバルscopeで宣言された変数aを参照するため、1を出力します.参照する変数が自分の範囲内でない場合は、親の範囲内でナビゲートします.
親スキャンマップにもない場合は、次の親スキャンマップをナビゲートし、スキャンチェーン上で順次ナビゲートし、最初に発見された識別子にアクセスして参照します.
(サブスキャンにアクセスせずに親スキャン方向にナビゲートする必要があります.)
かんすうレベルそうさ
varキーワードとして宣言された変数は、関数のコードブロック(関数体)が領域コードであることのみを認めます.これらの特性を関数レベルスキャン(functionlevelscope)と呼ぶ.
var x = 1;
if (true) {
// var 키워드로 선언된 변수는 함수의 코드 블록(함수 몸체)만을 지역 스코프로 인정한다.
// 함수 밖에서 var 키워드로 선언된 변수는 코드 블록 내에서 선언되었다 할지라도 모두 전역 변수다.
// 따라서 x는 전역 변수다. 이미 선언된 전역 변수 x가 있으므로 x 변수는 중복 선언된다.
// 이는 의도치 않게 변수 값이 변경되는 부작용을 발생시킨다.
var x = 10;
}
console.log(x); // 10
if文に宣言された変数xがグローバル変数として宣言される場合、if文のブロック領域が領域scopeであることを認めないためです.同じscope内で同じ名前の変数を宣言すると、2番目の宣言では、再割り当てのようにvarがないと表現されます.したがって、後に割り当てられる10はxの値である.でんしけんびきょう
JavaScriptはLexical Scopeに従うため、関数がどこから呼び出されるかではなく、関数がどこで定義されるかに基づいて親Scopeを決定します.関数呼び出しの場所は、親スキャンの決定には影響しません.すなわち,関数の位相スケールは常に自己定義のスケールである.
この関数の位相走査は,関数定義運転時に静的に決定される.関数定義(関数宣言または関数式)を実行して生成された関数オブジェクトは、このように決定された親スキャンを記憶します.関数を呼び出すたびに、関数の親スキャンを参照する必要があるためです.
var x = 1;
function foo() {
var x = 10;
bar();
}
function bar() {
console.log(x);
}
foo(); // 1
bar(); // 1
Reference
この問題について(スキャン), 我々は、より多くの情報をここで見つけました https://velog.io/@ursr0706/스코프テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol