パレット
スキャン
定義
鉛筆の鎖。
定義
var globalColor = 'red';
function foo() {
var fooColor = 'blue';
function bar() {
var barColor = 'yellow';
console.log(barColor); // yellow
console.log(fooColor); // blue
console.log(globalColor); // red
}
bar();
}
foo();
LexicalEnvironmentは2つの部分に分かれています.1.環境記録(Environment Record)-識別子を格納する場所
2.外部環境参照(Outer Environment Reference)-
内層関数がネストされた関数で自分のディレクトリ環境を検索すると、変数値が見つかりません.
->外部関数のLexical環境を参照してください.もしそれがなかったら?
->外部のLexical環境を参照します.
このようにLexical環境がnullになるまで参照を続けてきたのがScopeチェーンである.
下図のようにチェーンのように編んで参照します.
上の2つをもっとよく知ってください.
A関数でB関数を宣言し、C関数を再度宣言します.
function A(){
var a = 1;
function B() {
console.log(a);
function C() {
console.log(a);
}
}
}
Lexcial Environment(Lexcial Environment)ディレクトリ環境には2種類あります.関数Bのディレクトリ環境のouterEnvironmentReferenceは、関数Bが再宣言したとき(A)のディレクトリ環境を参照する.
各外部環境リファレンスは、宣言時に存在するディレクトリ環境のみを参照するため、最近の要素から順次アクセスでき、他の順序でアクセスできません.このような構造特性のため、複数のスキャンで同じ識別子が宣言されると、スキャンチェーンで最初に発見された識別子に無条件にアクセスするしかない.
const a = 1;
{
const a = 2;
console.log(a); (1)
}
console.log(a); (2)
(1)行はスキャン内に変数aがあるので,直接2を出力する.でも.
もしスコップリーに変数aがなかったら?
const a = 1;
{
console.log(a);//顕微鏡内には変数aがないので,外で最も近い変数が見つかる.これがスコフチェーンです.
}
console.log(a);
すいじゅんけい
種類
エンクロージャ
これはあいまいな解釈だ.モジュールを理解するためには,まずscope概念を理解する必要がある.
)
次のコードに注意してください.
私はこのコードで一度にCloserとScopeチェーンをつかむことができます.
if(1 < 2) {
function f = function() {
let abc = 123;
let ddd = function() {
return abc; // 스코프체인에 의해 abc가 스코프에 없으니 상위 스코프 뒤짐.
}
return ddd;
}
}
const ccc = f();
console.log(ccc()); /// 123
最初のfor文でarr[i]にマッピングされた値は特定の値ではなくfunction(){return i}である.という名前の関数です.この関数には領域変数がないため、後で実行すると独自のスキャン範囲から飛び出し、上位スキャンでiを参照しますが、関数の実際の実行時の2番目のfor文では、i値はすでに1番目のfor文の終了時の値なので5です.(varと宣言されたため、ブロックスキャン後もiは保持される)すべての結果値は5に統一される.
Reference
この問題について(パレット), 我々は、より多くの情報をここで見つけました https://velog.io/@ksung1889/스코프-클로저テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol