호이스팅(Hoisting)
함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것을 말한다.
컴파일러는 자바스크립트 엔진이 인터프리팅을 하기전에 컴파일을 한다.
- 인터프리팅(Interpreting) : 컴파일과 다르게 소스 코드를 한 번에 읽어서 번역하지 않고, 런타임 상태의 소스코드를 한 줄 한 줄 번역하면서 프로그램을 구동하는 방식이다. 한 줄씩 번역한 코드가 바로 기계어가 되는 것은 아니고 중간 코드(intermediate code)로 번역된다. 이 중간 코드는 다른 프로그램에 의해 기계어로 번역되어 실행된다.
예를 들어보자
console.log(a);
var a = 2;
컴파일 단계에서 자바스크립트 엔진은 이를 2개의 구문으로 확인한다.
var a
a = 2
var a 는 변수 선언문으로 컴파일을 할 때 처리하고, a = 2 는 실행할 때까지 내버려둔다. 따라서 변수 a는 호이스팅 되고 콘솔에는 다음과 같은 결과가 나온다.
undefined;
var 는 선언, 초기화가 동시에 이루어지기 때문에 undefined를 출력하지만,
let / const 는 선언단계만 호이스팅 되기 때문에 Reference Error를 출력한다.
함수선언문의 경우도 호이스팅 된다.
foo();
foo2();
// 함수 선언문
function foo() {
console.log('hello')
}
// 결과 : hello
// 함수 표현식
var foo2 = function() {
console.log('bye')
}
// 결과 : TypeError : foo2 is not a function
함수 표현식은 호이스팅 되지 않는다.
이때 TypeError 가 나오는 이유는 var = foo2 에 의해 undefined로 지정되었기 때문이다. 즉, 함수로 인식되지 않고 있음을 의미한다.
https://github.com/Esoolgnah/Frontend-Interview-Questions/blob/main/Notes/important-5/hoisting.md
https://gmlwjd9405.github.io/2019/04/22/javascript-hoisting.html
'코딩 > 정말 나는 잘 알고 있을까?' 카테고리의 다른 글
CSS 기본 지식 (0) | 2022.08.02 |
---|---|
클로저(Closure)가 뭐야? (0) | 2022.08.02 |
브라우저는 어떻게 동작하는가? (0) | 2022.08.02 |
Create React App, Next.js, Gatsby (0) | 2022.08.02 |
Git pull - Fatal: Not possible to fast-forward, aborting (0) | 2022.05.31 |