TIL37⎟JavaScript : Scope


scope & variable

for (var i = 0; i < 10; i++) {
  /* ... */
}
console.log(i);  // what will this output?
ここでは未定義またはエラーを推測できますが、値は10です.
ほとんどの他の言語では、上記のコードがerrorを出力します.変数iはブロックに制限されているので寿命(!)全力を尽くすから.ただし、javascriptで変数varを使用する場合、for loopが完全に実行されると、最後の値はscopeに保持されます.
したがって、blocklevel scopeのサポートは、ES 6の新しいletconstキーワードを介してJavaScriptに適用される.
変数contまたはletはblock level scopeであり、宣言前に参照できません.
変数varはfunction level scopeであり、宣言前に参照できます.

while solving this assignment...

function findSmallestElement(arr) {
  if (arr.length == 0){
    return 0
  } else {
    let min = arr[0]
    for (let i = 1; i < arr.length; i++) {
      if (arr[i] < min) {
         min = arr[i];
       }
  }
    return min;
}
}
数値からなるarrの値の中で最も小さい値を求める問題で、最初に基準値であるletmin=arr[0]をfor loopのblockに入れると、「minis notdefined」の値を出力するエラーが発生しました.for loop안에 넣어버리면 block level scope의 성질에 따라 변수 min의 값에 할당할 arr 함수를 가져올 수 없게 되기 때문이다!変数をfor loop blockの外に移動することによってarrの値が得られ,問題は良好に解決された.
const getEven = () => {
  let result = [];
  for (let i = 1; i <= 50; i++) {
    if (i % 2 == 0) {
      result.push(i);
    }
  }
  return result;
};
1から50の自然数から偶数を求めて配列に戻るという問題では,let resultの位置をfor文またはif文に初めて位置決めし,結果として値は与えられなかった.
ここでは、論理不足とコードが複雑であるほど、変数宣言が歪むことを示します.改めてコンセプトアレンジのscopeを整理する必要があると思います!
  • What is Scope ? 変数を宣言して使用可能なスペース
    ≪グローバル範囲|Global Range|Eas≫-JavaScriptアプリケーションのグローバル範囲
    Local Scope - 1. Function Scope,
    関数で宣言されたscope
    -2. Block Scope
    ≪グローバル変数|Global Variables|Eas≫-アプリケーションで使用可能な変数(関数外で宣言)
    Local variable-(関数で宣言)つまり、関数でのみ有効な変数
  • 簡単に言えば、外では中が見えず、中からしか外が見えません!

    let globalMessage = 'global'; //global variable
    function printMessage(){
    	let message = 'hello';
        console.log(message); //local variable
        console.log(globalMessae); 
        	function printAnother(){
            console.log(message);
            let childMessage = 'hello';
            }
            console.log(childMessage); //ChildMessage is not defined
         }
    printMessage();    
    このようにネストされた関数では、printMessage関数で定義された変数もprintAnother関数からアクセスできるため、親として定義されたメッセージ値を取得できますが、親から子関数の値を表示しようとすると表示されません.

    scope pollution


    global変数を使うと近づきやすいので良いと思いますが、悪用するとプログラムに迷惑をかけます.
    global変数がまだ生きている場合、変数値が常に変化している場合、変数を追跡するのは難しく、let、constとして宣言されている場所を見つけるのも難しい.そのため、これらの問題を避けるために、
    グローバル変数ではなく地域変数を使用することを推奨します.
    global変数はあちこち修正できないので、変数はできるだけblock scopeに分けるべきです.

    💡 The reason is...


    clockcoppingの変数はコードの品質を向上させ,コードがブロックに明確に区分されるため,コードの毒性が上昇する.
    プログラムが終わる前に変数は生きていない(blockが終わるとローカル変数の命は終わる)ので、メモリも節約できます.
    すなわち,グローバル変数の使用を避けるために努力し,{}内でlet,constをできるだけ使用し,新しく変数を作成する良好なscoping習慣を身につける.(•̀ᴗ•́)و ̑̑