앞서 공부한 내용에서 var hoisting
에 대해 간단하게 학습하였다.
실행 컨텍스트 내부의 environmentRecord
(환경레코드
)에는 매개변수의 이름, 함수 선언, 변수명 등이 담긴다. 호이스팅 시 위와 같은 식별자만이 등록된다. 예제를 통해 학습해보자.
function a(x) {
console.log(x); // --- (1)
var x;
console.log(x); // --- (2)
var x = 2;
console.log(x); // --- (3)
}
a(1);
undefined
로 추측할 수 있다.// 호이스팅 처리 후
function a() {
var x;
var x;
var x;
x = 1;
console.log(x); // --- (1)
console.log(x); // --- (2)
x = 2;
console.log(x); // --- (3)
}
a(1);
함수선언문의 호이스팅도 추가로 알아보자.
function a() {
console.log(b);
var b = 'bbb';
console.log(b);
function b() {}
console.log(b);
}
a();
function a() {
var b;
var b = function b() {}
console.log(b); // [Function: b]
b = 'bbb';
console.log(b); // 'bbb'
console.log(b); // 'bbb'
}
a();
함수 선언문과 함수 표현식의 호이스팅에 대해 알아보자.
console.log(sum(1, 2));
console.log(multiply(3, 4));
function sum (a, b) { // 함수 선언문
return a + b;
}
var multiply = function(a, b) { // 함수 표현식
return a + b;
}
// 호이스팅이 된 코드
var sum = function sum (a, b) { // 함수 선언문은 전체를 호이스팅 한다.
return a + b;
}
var multiply // 변수이기 때문에 선언부만 호이스팅 된다.
console.log(sum(1, 2));
console.log(multiply(3, 4));
multiply = function(a, b) { // 변수의 할당부는 원래자리에 남겨져 있다.
return a + b;
}
'Type Error'
가 발생된다.함수 선언문
의 경우 선언과 동시에 함수가 생성되기 때문에 혹시 모를 개발자들의 실수가 있을 시 위험하다고 한다. 함수 표현식
의 경우에는 함수가 담긴 변수만이 호이스팅 되기 때문에 보다 안전하다고 할수 있겠다.
📌 참고도서
- 코어 자바스크립트 - 정재남