[JS]護送/TDZ


ハウスティンとは何ですか。


Hoistingは、変数の宣言がメモリスペース宣言時にScopeの最上位レベルに昇格することを意味します.これにより、作成されたコードと実際のコードの実行順序が変化します.
function func()
{
	console.log(temp); //선언이 아래에 있지만 일단 실행은 된다(결과 : undefined)
	var temp = 1;
}

トランスファの動作原理


JavaScriptは、関数の実行時にScope内のすべての変数にメモリ領域を予約しようとします.したがって、コードの読み取り中に変数宣言の部分が見つかった場合、その変数はメモリに予め保存されます.
すなわち,上のtemp変数は実際にはconsoleである.log()の後にメモリに格納するのではなく、スペース自体が指定されています.ただし、この場合、スペースはありますが、実際には値は含まれません.コードの作成時に変数の宣言と初期化を一緒に行いますが、javascriptではこの2つの操作が異なる順序で行われます.
function func()
{
	var temp;
	console.log(temp); //temp는 메모리에 저장이 되어있지만, 실제 값은 아래에서 대입된다.
	temp = 1;
}
だからtemp宣言よりもconsole.ログ()を先に作成しても、エラーは発生しません.逆に、値が正しく入力されていないのは、予期せぬエラーの原因です.

varだけがエスケープ?


この話は間違っている.varだけでなくconstとletも反発します.ただしconst、letは上記の場合にエラーが発生します.(ReferenceError)
この2つのキーワードとvarの違いは,以下で記述するTDZが適用されるかどうかである.

TDZ欄


TDZは、Temporal Dead Zoneの略で、変数が宣言され初期化される前にその変数の使用を禁止する領域を指す.実質的には,varの炒め物による問題を予め遮断する概念と言える.
TDZにはvarは適用されず、letとconstを使用する場合に適用されます.まだ初期化されていない変数をTDZで使用すると、無条件にエラーが発生します.

ブールスキャン


ホイスティンは変数の声明を「鏡内」の最上位に引き上げた.ここでscopeは、このキーワードがどのキーワードであるかによって異なります.各キーワードのスキャン範囲は以下の通りです.
  • ブルスコフ:const、let
  • 関数スキャン:var
  • ブルーミラー


    ブルーミラーはブルー({…})これは、変数/関数がのみ機能することを意味します.blockと呼ぶと、関数宣言、if文、for文などで使用される括弧の範囲と同じです.
    すなわち、if文で宣言された変数はif文を超えた範囲では使用できません.ブロック内に内部ブロックが再び存在する場合、内部ブロックから外部ブロックの変数にアクセスできます.この可能性のある理由は、この顕微鏡の下で探す変数がなければ、上位の顕微鏡を探すことです.この現象は自己より高い方向にのみ発生するため,自己より高い方向では自己より低い値は利用できない.
    function func()
    {
    	let id = 9;
    	if(true)
    	{
    		const hi = 1;
    		console.log(hi); //1
    		console.log(id); //9
    	}
    	console.log(hi); //에러발생! Uncaught ReferenceError
    	console.log(id); //9
    }
    次の場合、再宣言はエラーになりません.(これは別のBLUEXCORによって許可され、同じブロック上でSyntexErrorが発生した可能性があります.)逆に、内部blockではletと宣言されるため、blockの最上位に宣言が上昇し、コンソールが発生します.log()はTDZ内にあります.そのためReferenceErrorが発生します.
    function test()
    {
    	let hi = 0;
    	if(true)
    	{
    		//let hi; //이렇게 진행이 된다.
    		console.log(hi); //에러 발생!
    		let hi = 2;
    	}
    }

    かんすうそういん


    関数スキャンは、関数内で変数/関数を宣言した後、関数内の任意の場所で使用できることを意味します.
    BLOCKとは異なり、内部ブロックに宣言された変数/関数も外部ブロックからアクセスできます!
    function test(){
      if(true)
      {
          var a = 100;
          console.log("variable inside the block scope : " , a);
      }
      console.log("variable outside the block scope : " , a); //에러가 발생하지 않는다.
    }