《 실행 컨텍스트 》에 이어 작성하는 글입니다.
호이스팅이란 선언된 변수나 함수 선언시 scope 내의 최상단으로 끌어올리는 것을 말한다. (레코드를 수집하는 과정이 호이스팅⭐)
console.log(a);
var a = 10;
js 코드는 인터프리터에 의해 한 줄씩 순차적으로 코드를 실행한다. 따라서 변수 a를 선언하기 전에 a를 출력하려고 하기 때문에 참조 에러가 발생하지 않을까?
❓ 하지만 참조 에러가 발생하지 않고 undefined
가 출력된다! 왜 그럴까?
그 이유는 변수 선언이 런타임 전 단계에서 실행되기 때문이다!
이게 무슨 말이냐, 런타임은 프로그램이 실행되고 있는 동안의 동작을 말한다.
즉, 프로그램이 실행되기 전에 변수 선언이 이루어진다는 것이다!
❓ 어떻게 프로그램이 실행되기 전 변수 선언이 이루어질 수 있을까?
인터프리터 과정을 거치기 전 소스코드의 평가 과정을 거치기 때문이다.
이처럼 코드 실행 전 변수나 함수를 찾아 스코프의 최상단으로 끌어올려주는 것을 호이스팅이라 말한다.
따라서 위 코드는 변수 a가 선언되기 전에 출력되었지만, 호이스팅으로 인해 변수 선언문이 스코프의 최상단으로 이동되기 때문에 에러가 발생하지 않고 undefined
가 출력된다.
- 매개변수 및 변수는 선언부를 호이스팅 한다.
function a (x) {
console.log(x);
var x;
console.log(x);
var x = 2;
console.log(x);
}
a(1);
function a () {
var x = 1;
console.log(x); // 1
var x;
console.log(x); // undefind
var x = 2;
console.log(x); // 2
}
a(1);
function a () {
var x;
var x;
var x;
x = 1;
console.log(x); // 1
console.log(x); // 1
x = 2;
console.log(x); // 2
}
a(1);
➡️ 실행 결과를 1 → undefined → 2
로 예상했지만, 실제로 1, 1, 2
라는 결과가 나왔다.
➡️ 이는 호이스팅이 적용되었기 때문!
- 함수 선언은 전체를 호이스팅한다.
function a () {
console.log(b);
var b = 'bbb';
console.log(b);
function b() { }
console.log(b);
}
a();
function a () {
var b; // 변수 선언부 호이스팅
function b() { } // 함수 선언은 전체를 호이스팅
console.log(b); // [Function: b] 출력
b = 'bbb'; // 변수의 할당부는 원래 자리에
console.log(b); // bbb 출력
console.log(b); // bbb 출력
}
a();
함수 선언문
console.log(add(3, 2)); // 5
function add(x, y) {
return x + y;
}
함수 표현식
console.log(result(3, 2)); // TypeError
var result = function (x, y) {
return x + y;
};
console.log(sum(1, 2));
console.log(multiply(3, 4));
function sum (a, b) { // 함수 선언문 sum
return a + b;
}
var multiply = function (a, b) { // 함수 표현식 multiply
return a + b;
}
// 함수 선언문은 전체를 hoisting
function sum (a, b) { // 함수 선언문 sum
return a + b;
}
// 변수는 선언부만 hoisting
var multiply;
console.log(sum(1, 2));
console.log(multiply(3, 4));
multiply = function (a, b) { // 변수의 할당부는 원래 자리
return a + b;
};
➡️ 협업을 많이하고 복잡한 코드일수록, 전역 공간에서 이루어지는 코드 협업일 수록, 함수 표현식을 활용해야 한다!!