코드에서 선언된 변수 및 함수를 끌어올려서 유효 범위의 최상단에 선언하는 것이다.
※ 실제로 코드가 끌어올려지는 것이 아니라 자바스크립트 parse가 미리 함수를 훑어서 정보를 기억하고 있는 것이다. 따라서, 메모리에서 변화는 없다.
따라서, 변수의 선언과 초기화 전에 변수를 참조하더라도 에러가 발생하지 않는다. 변수에 대한 선언을 기억하고 있어 메모리의 공간을 확보한 후, undefined로 초기화하기 때문이다. 이러한 현상을 호이스팅이라고 한다.
console.log(name); // undefined
var name = 'apple';
console.log(name); // 'apple'
선언만 끌어 올리고, 할당은 끌어올리지 않는다.
var 변수
일시적 사각지대(TDZ)
가 선언과 초기화 사이에 생기고, 할당문에서 변수 값이 할당 될 때 초기화 및 값 할당이 이루어진다.함수 선언문
fruitName('apple');
function fruitName(name) {
console.log(name);
};
// 'apple'
함수 선언문에서 선언부가 미리 끌어올려지기 때문에 fruitName에 대한 정보를 기억하고 있다. 따라서, 선언 전에 호출해도 에러가 발생하지 않는다.
// 함수 표현식
fruitName('apple'); // error
var fruitName = function() {
console.log(name);
};
// 함수 표현식이 var이면 TypeError
// let/const이면 RefernceError
하지만, 함수 표현식은 선언 전에 호출하려고 하면 에러가 발생한다. 호이스팅이 적용되지 않기 때문이다.
var fruitName;
function fruitName() {
console.log("apple");
}
fruitName = "banana";
console.log(typeof fruitName) // String
var fruitName; // 할당 x
function fruitName() {
console.log("apple");
}
console.log(typeof fruitName) // function
상단
에 선언하면, 호이스팅으로 인한 스코프 꼬임 현상 방지let
/ const
사용