[Javascript]クレーンとは?


号イースト(クレーン)
:ロープまたはチェーンで巻き付けられたドラムまたはリフトホイールを使用して荷重を上げる装置、またはリフト動作自体.
Hoistという言葉の意味を考えると、JavaScriptのHoistingの意味がよく覚えられます.

JavaScriptでのアクセラレータ(アップグレード)


コードで宣言された変数と関数をコードの上部に昇格させ、その変数と関数の有効範囲の上部に宣言します.実際のコードがアップグレードされるのではなく,JavaScript解析器内部でアップグレードすることで処理される.実際のメモリに変化はありません.
ハウステンはvar 변수의 선언함수선언문でしか発生しなかった.
まず、変数シースは、変数の宣言と初期化時に、変数が属する関数内で最上位に上昇します.let/cont変数を宣言すると、エスケープは発生しません.
console.log("Hi");
var name = "moone";
let name2 = "moone2";

↓ ↓  (javascript parser 내부에서 처리되는 결과)

var name;			//var 변수 선언 (hoisting)
console.log("Hi");
name = "moone";			//변수에 할당
let name2 = "moone2";		//hoisting 발생하지 않음
関数シースは、関数の宣言をコードの最上位レベルに引き上げます.関数式を使用すると、ハイライトは発生しません.
first();
second();

function first() {
    console.log("First hello");
}

var second = function() {
	console.log("Second hello");
}

↓ ↓  (javascript parser 내부에서 처리되는 결과)

var second;		//변수 선언 (hoisting)

function first() {	//함수 선언문 실행 (hoisting)
    console.log("First hello");
}

first();
second();		//Error 발생!!!

second = function() {	
	console.log("Second hello");
}
変数に割り当てられた関数式は、昇格によって昇格しません.変数のスキャンルールに従います.

関数宣言文と関数式のエスケープ

  • 関数は、コードがどこで実装されているかにかかわらず、ブラウザがjavascriptを解析するときに最上位に引き寄せられることを宣言します.
  • 関数式は、宣言と呼び出しの順序で正常に動作しない可能性があります.=関数式では、宣言と割り当ての分離が発生します.
  • 1)関数式の宣言が呼び出しより高い場合(通常)
    function sayHello(name) { 	// 함수선언문
         var getName = function() { // 함수표현식 
             return "moone";
         }
            
         var userName = getName(); // 함수 "호출"
         console.log("Hello, " + userName);
     }
    
     sayHello(); 	//"Hello, moone"
     
     ↓ ↓  (javascript parser 내부에서 처리되는 결과)
     
     function sayHello(name) {
     	var getName;	//함수표현식의 변수값 선언 (hoisting)
        	var userName;	//var 변수값 선언 (hoisting)
            
         getName = function() { // 함수표현식 할당
             return "moone";
         }
            
         userName = getName(); // 함수 "호출"
         console.log("Hello, " + userName);
     }
    
     sayHello(); 	//"Hello, moone"
    2)関数式の宣言が呼び出しの下にある場合(TypeError)
     function sayHello(name) {		//함수 선언문
       console.log(getName);		//undefined => 선언은 되어 있지만 값이 할당되어 있지 않음
       var userName = getName();	//error
       console.log("Hello, " + userName);
        
        var getName = function() { 		// 함수표현식 할당
             return "moone";
        }
     }
     sayHello();		//TypeError: getName is not a function
    3)関数式の宣言は呼び出しの下にあり,let/cont変数(ReferenceError)に割り当てられている.
    ->let/constの場合、転送は発生しません
    function sayHello(name) {
      console.log(getName);		//error
      let userName = getName();
      console.log("Hello, " + userName);
      
      let getName = function() {
        return "moone";
      }
    }
    sayHello();		//ReferenceError: getName is not defined
    😎👍
    Javascriptの基本コードについて理解しました.
    足りない内容を補充!(呼び出し優先度、関数式/関数宣言差異など)

    References


    https://gmlwjd9405.github.io/2019/04/22/javascript-hoisting.html
    https://ojava.tistory.com/144
    https://web-front-end.tistory.com/23