[programmers] TIL_DAY-13


✅ Scope


変数の範囲はどこからどこまでですか?
プログラミング言語を学ぶとき、scopeは欠かせない概念です.宣言した変数がどこにあるか、どこで使用できるかを知る必要があります.
  スキャンを大きく2つに分類すると、グローバルスキャンとゾーンスキャンに分けることができます.変数をグローバル範囲に宣言すると、コードの任意の場所でグローバル範囲内の変数を参照できます.
変数をゾーンスキャンに宣言する場合は、その変数を宣言するゾーンでのみ参照できます.(サブ領域を含む.)
// global 
var globalVar = 10;

function isGlobal() {
  console.log(globalVar);
}
isGlobal(); // 10;

// local
function isLocal() {
  var localVar = 20;
  console.log(localVar);
}
isLocal(); // 20;
console.log(localVar); // localVar is not defined
 上記のコードによれば、グローバルスキャンによって宣言されたグローバルVar変数はisGlobal()関数内でアクセスできます.グローバルスキャンの変数は、コード内の任意の場所で参照できます.
 一方、localVal変数については、isLocal()関数の内部で宣言されるため、isLocal関数領域スキャンがあります.外部から参照できません.
  スコフの種類はこれだけではない.領域スキャンはブロックレベルスキャンと関数レベルスキャンに分けられる.これは、地域をどのように分類するかによって異なります.
  ブロックレベルスキャンの場合:{...}ブロック内部をエリアとして使用します.関数レベルスキャンではfunction(){...}ブロック内部をエリアとして使用します.
どうせ同じ内部を指しているのではないでしょうか.
 ここでいうブロックは、ユーザが単独で使用するブロックだけでなく、文条件文を繰り返すブロックも含む.
// block level scope & function level scope
for(let i = 0; i < 3; i++) {
  var blockVar = 10 * i;
  console.log(blockVar); // 0 10 20
  console.log(i); // 0 1 2
}
console.log(blockVar); // 20
console.log(i) // i is not undefined
 コンソールはここでどのように出力されますか?for문案で宣言されたblockVarvarであるため、함수 레벨 스코프に従う.したがって、ここではグローバル変数です.{}内部にあるが、varの特性のため、ここではグローバル変数と見なされ、外部から参照することができる.逆に、ifor문内部で宣言され、let블록 레벨 스코프に従うため、for文内部でのみ参照できます.
function outFunctionBlock() {
  var outFunctionValue = 10;
  function inFunctionBlock() {
    var inFunctionValue = 20;
    console.log(inFunctionValue);
    console.log(outFunctionValue);
  }
  inFunctionBlock();
  console.log(outFunctionValue);
  console.log(inFunctionValue);
}

outFunctionBlock();
 このコードを実行すると、outFunctionBlockで宣言されたoutFunctionValueoutFunctionBlock 스코프を有します.内部定義のinFunctionBlockで宣言されたinFunctionValueは、inFunctionBlock 스코프を有する.したがって、inFunctionBlockで動作するコンソールは、通常20,10を出力する.ただし、outFunctionBlockで動作しているコンソールではoutFunctionValueは正常に出力されていますが、inFunctionValue is not definedでエラーが発生しました.

✅ JavaScript Scope!


 他の言語とは異なり、javascriptはブロックレベルのスキャンではなく関数レベルのスキャンに従います.これらの欠点を補うために、letconstが追加された.
 JavaScriptコードを作成する場合、他の言語とは異なり、エントリポイントは別にありません.したがって,変数の使用を考慮しなければ,グローバルとして容易に使用できる.

Lexical Scope

var x = 1;

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

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

foo();
bar();
 このコードの実行結果を予測すると、x전역 변수と宣言され、foo 함수からxは10に変更され、bar 함수が実行される.したがって、bar 함수の内部には、変更後のxが出力される.その結果、10 10が出力される見込みです.
JavaScriptはLexical Scopeに従います.
 javascriptは렉시컬 스코프に従うため、上記の予測は間違っています.Lexicalscopeによると、함수를 어디서 호출하는지에 따라 스코프가 결정ではなく어디서 선언하였는지에 따라 스코프가 결정です.
 これに基づいて上記のコードを予測すると、전역 변수 xおよび함수 foo, barが宣言される.foo 함수xに変更し、10を実行する.bar 함수宣言はbar 함수であるため、전역に従う.전역 스코프를のうち전역 스코프は既存のxであるため、1を運転するとfoo 함수が出力され、1を運転するとbar 함수も出力される.
Lexical Scopeに準拠したJavaScriptを使用する場合は、関数の呼び出し位置よりも関数の宣言位置を明確にする必要があります.
注意:poiemaweb.com

整理する


 プログラムを作成するときは、変数の有効範囲、範囲、範囲を熟知してこそ、プログラムの流れと動作を正確に予測することができる.また,プログラミングの過程では,グローバル変数を必要とする時刻が多い.グローバル変数のみを使用してコードを記述するので、どこでも参照できますので、プログラムを記述するのは便利です.しかし、いくつかの本や専門家によると、グローバル変数を使用しないことをお勧めします.グローバル変数を乱発すると,ある瞬間にコードストリームを読み取ることができず,コードが汚くなる.したがって,グローバル変数の使用を最大限に減らすために,種々の方法を習得し実践すべきである.😅