スキャン


スキャン(有効範囲)は、JavaScriptを含むすべてのプログラミング言語の基本と重要な概念です.Scopeの理解が足りなければ他の概念を理解するのは難しいかもしれませんので、理解してスキップしてください!!

スコットランド?


私たちはもうスコフを経験したことがある.関数のパラメータは、関数体の内部でのみ参照でき、関数体の外部では参照できません.これは,パラメータの有効範囲,すなわちパラメータのスキャンが関数体内部に限定されるためである.
スキャン
現在実行中のコンテキストを指します.ここで、コンテキスト表示値と式は、「表示」または「参照」できます.変数またはその他の式が「対応するスキャン」に含まれていない場合は、使用できません.スキャンには階層もあるため、サブスキャンは親スキャンにアクセスできますが、逆にすることはできません.
[ソース]-MDN用語辞典
function add(x,y) {
  //매개변수는 함수 몸체 내부에서만 참조할 수 있다.
  //즉, 매개변수의 스코프(유효범위)는 함수 몸체 내부이다.
  console.log(x,y);
  return x + y;
}

add(2, 5);

//매개변수는 함수 몸체 내부에서만 참조할 수 있다.
console.log(x, y); //Reference Error
変数は、宣言された位置によって独自の有効範囲を決定します.すなわち、他のコードは変数自体の範囲を参照できます.変数だけでなく、すべての識別子です.すなわち、すべての識別子(変数名、関数名、クラス名など)は、宣言された位置によって、他のコード参照識別子自体の有効範囲を決定する.それをひっくり返す.
すなわち,スキャンは指標識別子の有効範囲である.
次の例がどのように動作するかを考えてみましょう.(非常に基本的な…)
var x = 'global';

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

foo();

console.log(x); // answer 2
答え1=local、答え2=global(簡単すぎますか…?)
JavaScriptエンジンでは、2つの同じ名前の変数で参照すべき変数を決定する必要があります.これを識別者決定と呼ぶ.JAvascriptエンジンは、スキャンによってどの変数を参照すべきかを決定します.
したがって,ScopeはJavaScriptエンジンが識別子を検索する際に用いるルールといえる.
コードコンテキストと環境
「コードがどこで実行され、周囲にどのようなコードがあるか」をLexical環境と呼びます.すなわち,コードのコンテキストはLexical環境からなる.これを実装するのは実行コンテキストであり、すべてのコードは実行コンテキストで評価され、実行されます.
もし...コンセプトがない場合、同じ名前の変数が競合するため、プログラム全体で1つしか使用できません.
varキーワードとして宣言された変数の繰り返し宣言
varキーワードとして宣言された変数は、同じ範囲内で繰り返し宣言できます.これにより、予期せぬ変数値の再割り当てによって変更される副作用が発生します.
function foo() {
  var x = 1;
  //var 키워드로 선언된 변수는 같은 스코프 내에서 중복 선언을 허용한다.
  //아래 변수 선언문은 자바스크립트 엔진에 의해 var 키워드가 없는 것처럼 동작한다.
  var x = 2;
  console.log(x); // 2
}
foo();
하지만 let 이나 const 키워드로 선언된 변수는 같은 스코프 내에서 
중복 선언을 허용하지 않는다.
function bar() {
  let x = 1;
  let x = 2; // Syntax Error 
"let과 const로의 변수 선언".. 아마 다음? 다다음 챕터에서 다룰 것이다!! 

ひょうほん


コードは、グローバルとゾーンに分割できます.
全域スキャンとゾーンスキャン

ひょうじチェーン


関数は、グローバルで定義することも、関数ボディの内部で定義することもできます.関数体内部で定義された関数を関数の重ね合わせと呼ぶ.また,関数体内部で定義された関数を重畳関数と呼ぶ.オーバーラップ関数を含む関数を外部関数と呼びます.関数はオーバーラップしてもよく、関数の領域スキャンはオーバーラップしてもよい.これは,スコフが関数の重なりに基づいて階層を持つことを意味する.言い換えれば、オーバーラップ関数の領域スキャンとオーバーラップ関数を含む外部関数の領域スキャンは階層構造を有する.このとき,外部関数の領域走査を重畳関数の位相走査とする.
すべてのスキャンは1つの階層に接続され、すべての領域の最高スキャンはグローバルスキャンです.このように、スタンダードが階層的に接続されているのはスタンダードチェーンと呼ばれています.
変数を参照する場合、JavaScriptエンジンは、参照変数のコードのスキャンからスキャンチェーンを介して、宣言された変数を上方向に移動して検索します.
スコフ鎖は物理的実体として存在する.JavaScriptエンジンは、コード(グローバルコードと関数コード)を実行する前に、実際にディレクトリ環境を作成します.変数宣言を実行すると、変数識別子はキーとしてこのデータ構造(ローカル環境)に登録され、変数割り当てが発生すると、このデータ構造の変数識別子に対応する値が変更されます.変数の検索もこの資料構造上で行われる.
リモート環境
scopeチェーンは、一方向接続実行コンテキストの集合環境です.コードがロードされると、すぐにグローバルコレクション環境が作成され、関数のコレクション環境は、関数が呼び出されるとすぐに作成されます.これについては、「実行コンテキスト」セクションでさようなら.

かんすうレベルそうさ


領域とは人体の内部を指し、領域は領域スキャンである.これは、コードブロックではなく関数のみによって領域スキャンが生成されることを意味する.
CやJavaなどを含むプログラミング言語の多くは、すべてのコードブロック(If、for、whileなど)によって領域スキャンが作成されます.これらの特性をブロックレベルでスキャンします.ただしvarキーワードとして宣言された変数は,関数のコードブロック(関数体)が領域コードであることのみを認める.これらのプロパティを関数レベルに設定します.
var x = 1;

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

console.log(x);  // 10
グローバル変数xが宣言され、if文のコードブロック内にもx変数が宣言されます.このときif文のコードブロック内で宣言されるx変数はグローバル変数である.varキーワードとして宣言された変数は、関数レベルのscopeのみが認められるため、関数外でvarキーワードとして宣言された変数は、コードブロック内で宣言してもグローバル変数である.したがって、グローバル変数xは繰り返し宣言され、その結果、予期しないグローバル変数の値が再割り当てされる.
varキーワードとして宣言された変数は、関数のコードブロックが領域スキャンであることのみを認めますが、ES 6に導入されたlet、constキーワードはブロックレベルスキャンをサポートします!(を参照)

でんしけんびきょう

var x = 1;

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

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

foo(); // 1
bar(); // 1
最初は10,10と答えました.(関数ではなくifだと思いましたが…)
上記の例の実行結果はbar関数の親スキャンが何であるかによって異なります.
2つのパターンを予測できます.
関数の位相は、
  • 関数がどこで呼び出されるかによって決定される.
  • 関数がどこで定義されるかに基づいて、関数の位相を決定する.
  • ダイナミックスキャンの最初の方法.関数を定義するとき、関数がどこから呼び出されるか分かりません.したがって、関数呼び出し時に親スキャンを動的に決定する必要があるため、動的スキャンと呼ばれる.
    2回の再現方式はLexical Scoperまたは静的Scoperである.動的走査と同様に,位相走査が動的を維持し,関数定義が評価されると,位相走査は静的に決定される.JavaScriptを含むほとんどのプログラミング言語はLexical Scope(静的Scope)に従う.
    JavaScriptはLexical Scopeに従うため、関数がどこから呼び出されるかではなく、関数がどこで定義されるかに基づいて親Scopeを決定します.関数呼び出しの場所は、親スキャンの決定には影響しません.
    すなわち,関数の位相スケールは常に自己定義のスケールである.
    この関数の位相走査は,関数定義運転時に静的に決定される.関数定義(関数宣言または関数式)を実行して生成された関数オブジェクトは、このように決定された親スキャンを記憶します.関数を呼び出すたびに、関数の親スキャンを参照する必要があるためです.
    LexicalscopeはCloserと深い関係がある.
    これに対して、Closer部分でしっかり勉強しましょう!!(Closer困難ㅠㅠ)