본문 바로가기
Script/JavaScript

[JavaScript] Chapter 11. 호이스팅

by song.ift 2022. 12. 14.

호이스팅 (Hoisting)

  • 변수의 정의가 그 범위에 따라 선언(declaration) / 초기화(initialization) / 할당 분리되는 것을 의미한다.
  • 쉽게 말하면, 변수가 함수 내에서 정의되었을 경우, 선언이 함수의 최상위로, 함수 바깥에서 정의되었을 경우는 전역 컨텍스트의 최상위로 변경된다.
  • 선언한 코드를 내부적으로 최상단으로 끌어올림
  • var와 함수 선언이 대상

=> 선언된 var는 최상단으로 올라간다는 의미

=> 선언된 let, const는 최상단으로 올라갈 수 없음

=> 선언된 함수는 최상단으로 올라간다는 의미

 

1. 일반적인 코딩 순서

[선언]                     var myAge;

[초기화 or 할당]  myAge = 30;

[코드 사용]            document.write(myAge);

// 선언
function sum(num1, num2) {
    return num1 + num2;
}

sum(10, 20);  // 사용
2. 호이스팅

[코드 사용]           document.write(myAge);

[선언]                     var myAge;

[초기화 or 할당]  myAge = 30;

sum(10, 20);  // 사용

// 선언
function sum(num1, num2) {
    return num1 + num2;
}

 

호이스팅 - var 변수

document.write(num1);  // 10이 아니라 undefined 출력
var num1 = 10;

// 위에 코드가 호이스팅 된 코드
// undefined가 뜨는 이유는
// var num1;  // undefined (선언한 후, 정의를 하지 않아서 자동으로 undefined로 초기화)
// document.write(num1);
// num1 = 10;  // 선언 코드가 호이스팅이 되고, 정의한 것은 되지 않는다.

 

호이스팅 - let, const 변수

TDZ
  • Temporal Dead Zone (일시적 사각지대)
  • let/const선언은 기본적으로 실행중인 실행 컨텍스트의 어휘적 환경(Lexical Environment)으로 범위가 지정된 변수를 정의한다. 변수는 그들의 어휘적 환경에 포함될 때 생성되지만, 어휘적 바인딩이 실행되기 전까지는 액세스할 수 없다. 새로운 범위에 진입할 때마다 지정된 범위에 속한 모든 let/const바인딩이 지정된 범위 내부의 코드가 실행되기 전에 실행된다. (즉, let/const선언이 호이스팅된다.) 어휘적 바인딩이 실행되기 전까지 액세스할 수 없는 현상을 TDZ라고 한다.
  • 쉽게 말하면, 스코프에 진입할 때 변수가 만들어지고 TDZ(Temporal Dead Zone)가 생성되지만, 코드 실행이 변수가 실제 있는 위치에 도달할 때까지 액세스할 수 없는 것이다.
  • 변수는 있지만 초기화 또는 할당 안 됨 => ReferenceError 발생
// 선언
// undefined가 아닌 Error 발생
// TDZ 구간
document.write(num1);
document.write(num2);

// 선언
let num1;
const num2 = 20;

'Script > JavaScript' 카테고리의 다른 글

[JavaScript] Chapter 13. Ajax  (0) 2022.12.15
[JavaScript] Chapter 12. IIFE  (0) 2022.12.14
[JavaScript] Chapter 10. 스코프  (0) 2022.12.13
[JavaScript] Chapter 09. DOM  (0) 2022.12.12
[JavaScript] Chapter 08. 객체  (0) 2022.12.10

댓글