구분 | 중복 선언 | 재할당 | scope | 호이스팅 |
---|---|---|---|---|
var | O | O | 함수 레벨 스코프 (function-level scope) | 초기 값 undefined 할당한 것을 호이스팅한 후 해당 코드에서 작성한 값 할당 |
let (ES6) | X | O | 블록 레벨 스코프 (block-level scope) | 호이스팅시 초기값 할당 X |
const (ES6) | X | X | 블록 레벨 스코프(block-level scope) | 호이스팅시 초기값 할당 X |
var greeting = 'hello';
console.log(greeting); // hello
var greeting = 'hi';
console.log(greeting); // hi
greeting = 'how are you?';
console.log(greeting); // how are you?
function func() {
if (true) {
var a = 'a';
console.log(a); // a
}
console.log(a); // a
}
func();
// console.log(a); // ReferenceError: a is not defined
// 중복 선언 불가, 재할당 가능
let greeting = 'hello';
console.log(greeting); // hello
// let greeting = 'hi'; // 오류 발생 : 중복 선언 불가
greeting = 'how are you?';
console.log(greeting); // how are you?
function func() {
if (true) {
let a = 'a';
console.log(a); // a
}
// console.log(a); // ReferenceError: a is not defineds
}
func();
// console.log(a); // ReferenceError: a is not defined
// 중복 선언 불가, 재할당 불가
const greeting = 'hello';
console.log(greeting); // hello
const greeting = 'hi'; // 오류 발생 : 중복 선언 불가
greeting = 'how are you?'; // 오류 발생 : 재할당 불가
console.log(greeting); // how are you?
호이스트(Hoist)의 뜻은 무언가를 들어 올리거나 끌어 올리는 동작을 설명합니다.
자동차를 강에서 올린다(Hoist)라고 할 수 있습니다.
JS에서 호이스팅은 코드가 실행되기 전에 변수 및 함수 선언(이름)이 로컬 범위(유효 범위)의 맨 위로 들어올려지거나 끌어올려지는 경우를 설명한다.
console.log(greeting); // undefined
var greeting = 'hello';
func(); // hoisting test
function func() {
console.log('hoisting test');
}
console.log(greeting); // ReferenceError: Cannot access 'greeting' before initialization
let greeting = 'hello';