This page was translated from English by the community. Learn more and join the MDN Web Docs community.

View in English Always switch to English

호이스팅

JavaScript 호이스팅은 인터프리터가 코드를 실행하기 전에 함수, 변수, 클래스 또는 임포트(import)의 선언문을 해당 범위의 맨 위로 끌어올리는 것처럼 보이는 현상을 뜻합니다.

호이스팅은 ECMAScript 사양에서 규범적으로 정의된 용어가 아닙니다. 사양에서는 선언 그룹을 HoistableDeclaration로 정의되어 있지만, 여기에는 function, function* 만 포함되어 있습니다, async 함수, async 함수 선언을 사용하세요. 호이스팅은 다른 방식이긴 하지만 종종 var 선언의 기능으로 간주되기도 합니다. 구어체 용어로는 다음과 같은 동작을 호이스팅으로 간주할 수 있습니다.

  1. 변수가 선언된 줄 이전에 해당 범위에서 변수 값을 사용할 수 있는 경우 ("값 호이스팅")
  2. 변수가 선언된 줄 이전에 해당 범위의 변수를 참조할 수 있지만 ReferenceError를 던지지 않고 값이 항상 정의되지 않음인 경우입니다. ("선언 호이스팅")
  3. 변수를 선언하면 변수가 선언된 줄 앞의 범위에서 동작이 변경됩니다.
  4. 선언의 부작용은 선언이 포함된 나머지 코드를 평가하기 전에 발생합니다.

위의 네 가지 함수 선언은 유형 1 동작으로 호출되고, var 선언은 유형 2 동작으로 호출됩니다. let, constclass 선언(총칭하여 lexical 선언이라고도 함)은 유형 3 동작으로 올라갑니다. import 선언은 유형 1 및 유형 4 동작으로 호출됩니다.

일부에서는 let, constclass를 호이스트되지 않는 것으로 보는 것을 선호하는데, 그 이유는 temporal dead zone이 선언 이전의 변수 사용을 엄격하게 금지하고 있기 때문입니다. 호이스팅은 보편적으로 합의된 용어가 아니기 때문에 이러한 반대는 괜찮습니다. 그러나 temporal dead zone은 그 범위에서 관찰 가능한 다른 변화를 일으킬 수 있으며, 이는 어떤 형태의 호이스팅이 있음을 시사합니다.

js
const x = 1;
{
  console.log(x); // 참조 에러
  const x = 2;
}

만약 const x = 2 선언이 전혀 호출되지 않는다면(즉, 실행될 때만 효력이 발생한다면), console.log(x) 문은 상위 범위에서 x 값을 읽을 수 있어야 합니다. 그러나 const 선언은 여전히 정의된 전체 범위를 "오염"시키기 때문에 console.log(x) 문은 아직 초기화되지 않은 const x = 2 선언에서 x를 대신 읽어서 ReferenceError를 던집니다. 하지만 실용적인 관점에서 볼 때 이러한 선언의 호이스팅은 의미 있는 기능을 제공하지 않기 때문에 어휘 선언을 비호이스팅으로 특성화하는 것이 더 유용할 수 있습니다.

다음은 호이스팅의 한 형태가 아니라는 점에 유의하세요.

js
{
  var x = 1;
}
console.log(x); // 1

여기에는 "선언 전 접근"이 없는데, 이는 단순히 var 선언이 블록으로 범위가 지정되지 않았기 때문입니다.

호이스팅에 대한 자세한 내용은 다음을 참조하십시오.

참조