

var x = 1;
if(true) {
// x 는 전역변수로 선언이 되었으므로 코드 블록 내에서 선언하더라도 전역 변수가 됨
// 따라서 변수 값이 의도치 않게 변경 됨
x = 10;
}
console. log(x); // 10
console.log(foo); //undefined
// 변수에 값을 할당
foo = 123;
console.log(foo) // 123
// 변수 선언은 런타임 이전에 자바스크립트 엔진에 의해 암묵적으로 실행
var foo;
변수 호이스팅은 가독성을 떨어뜨리고 오류를 발생시킬 여지를 남긴다
let foo = 1; // 전역 변수
{
let foo = 2; // 지역 변수
let bar = 3; // 지역 변수
}
console.log(foo); // 1
console.log(bar); // ReferenceError
함수 내의 코드 블록은 함수 레벨 스코프에 중첩
// 런타임 이전에 선언 단계 실행, 아직 변수가 초기화 되지 않음
// 초기화 이전의 일시적 사각지대에서는 변수 참조 불가
console.log(foo); //undefined
foo = 1; // 할당문에서 할당 단계 실행
console.log(foo); // 1
}
하지만 let 키워드로 선언한 변수도 여전히 호이스팅이 발생
자바스크립트는 ES6에서 도입된 let const를 포함한 모든 선언을 호이스팅하기 때문
일단 선언 후 재할당이 필요하다면 let으로 변경