인터프리터가 코드를 실행하기 전에 함수, 변수, 클래스 또는 import의 선언문을 해당 범위의 맨 위로 끌어올리는 것처럼 보이는 현상
아래 javascript 코드를 vs에서 실행하면
console.log(a)
var a = 10
console.log(a)
원래라면 a는 참조오류가 나야한다.
하지만
결과로 나온다.
왜? 그럴까?
javascript가 해당 코드를 실행할 때 변수 호이스팅이 발생하여
변수 선언문을 최상단으로 보낸다.
var a
a = undefined
console.log(a)
a = 10
console.log(a)
결과적으로 이렇게 변환해서 실행하기 때문에 오류가 나지 않고 undefined가
나타나는 것이다.
여기서 var가 아니라 ES6부터 등장한 let으로 선언하면 어떻게 동작할까?
정답은 '실행환경에 따라 다르다.' 이다.
크롬에서는
이렇게 오류가 난다.
vs 코드에서도 오류가 난다.
personal-JS에서는 정상 동작함
JavaScript는 왜 이따위? 일까
초기의 Javascript는 html 웹 사이트의 동적인 동작을 도와주는 작은 영역이었다.
동적인 영역의 중요성이 커지면서 js의 역할이 커져갔고 js가 발전함에 따라 이전에 버그로 생각했던 코드들이 레거시로 남아있게 된 것
그럼 상수 const는 어떻게 동작할까?
console.log(PI)
const PI = 3.141592
console.log(PI)
결과는
personal-JS에서는 const도 호이스팅 되어
undefined
3.141592
로 나오는 것을 볼 수 있다.
하지만 크롬과 vs에서는 오류가 난다.
let과 const의 호이스팅은 personal-JS의 오류 같기도하다..
console.log(myVar); // undefined
var myVar = 10;
console.log(myVar); // 10
console.log(myVar); // undefined
var myVar;
myVar = 10;
console.log(myVar); // 10
console.log(myVar); // undefined
var myVar = 10;
if (true) {
console.log(myVar); // undefined
var myVar = 20;
console.log(myVar); // 20
}
console.log(myVar); // 10
const x = 1;
{
console.log(x); // 참조 에러
const x = 2;
}