자바스크립트 함수 코드 해석 순서
예제 코드
function book() {
debugger;
var title = "hello";
function getBook() {
return title;
}
var readBook = function () {
getBook();
};
}
book();
- book() 호출
- loop1, 함수 선언문 해석
function getBook() {};
- loop2, 변수 초기화
var title = undefined;
var readBook = undefined;
- loop3, 코드 실행
var title = 'hello';
var readBook = function() {};
getBook();
함수 선언문 해석
- 마지막 줄에서 book() 함수를 호출함.
- 엔진 제어가 book 함수의 첫 번째 줄로 이동
debugger
를 실행하지 않는다.
- 함수 안에서 함수 선언문을 찾는다.
- 위에서 아래로 내려가면서 하나씩 검색
function getBook() {}
이 함수 선언문이므로 function 오브젝트를 생성한다.- 더 이상 함수 선언문이 없으므로 다시 함수의 첫 번째 줄로 이동한다.
변수 초기화
debugger
를 실행하지 않는다.var title = 'hello';
title
변수에undefined
를 할당한다.'hello'
를 할당하지 않는다.
function getBook() {}
은 초기화를 했으므로 초기화하지 않는다.var readBook = function() {};
readBook
변수에undefined
를 할당한다.- 함수 표현식은 변수를 선언만 한다.
- 초기화 단계가 끝나면 함수의 첫 번째 줄로 이동한다.
코드 실행
- debugger를 실행하면서 실행이 멈춘다.
var title = 'hello'
title
변수에'hello'
를 할당한다.
function getBook() {return title};
- 실행이 아닌 선언이므로 다음 줄로 이동한다.
var readBook = function() {};
- function 오브젝트를 생성하여
readBook
변수에 할당한다. - readBook이 function 오브젝트가 되므로 이제 readBook 함수를 호출할 수 있다.
- function 오브젝트를 생성하여
getBook()
함수를 호출한다.- 같은 방법으로
getBook()
함수의 함수와 변수를 초기화하고 코드를 실행한다.
- 같은 방법으로
함수 선언문 해석 → 변수 초기화(undefined) → 코드 실행 순서로 해석해야 한다. 만약 변수 초기화 시점에서 함수 선언문에 의해 function object가 할당되어 있다면 초기화 되지 않는다.