// ===== 코딩 시간 =====
// 1. 함수 선언문 - 함수 호출 - 함수 선언문
function book() {
function getBook() {
return "책 1";
}
console.log(getBook());
function getBook() {
return "책 2";
}
}
book();
// 책 2
/**
* 1. 엔진은 함수 선언문을 찾아 해석한다.
* + 첫 번째 getBook 선언문을 만나, Function 오브젝트를 생성한다. "값"을 초기화하고 Scope가 설정된다.
* + 두 번째 getBook 선언문을 만나, Function 오브젝트를 생성하지만, 이미 같은이름존재하므로, 값만 "책 2" 로 변경된다.
* 2. 변수 초기화
* 3. 함수 코드 실행
* + Scope 에 설정되어있던, 두 번째 getBook Function 오브젝트의 반환 값인, "책 2"이 반환된다.
*/
// 2. 함수 표현식 - 함수 호출 - 함수 표현식
function book() {
var getBook = function () {
return "책 1";
};
console.log(getBook());
var getBook = function () {
return "책 2";
};
}
book();
// 책 1
/**
* 1. 함수 선언문 해석
* 2. 변수 초기화
* + 첫 번째 getBook 이라는 변수의 function 키워드를 만나 undefined 로 설정
* + 두 번째 getBook 변수에 또 function 키워드를 만나 undefined 덮어 설정
* 3. 함수 코드 실행
* + 첫 번째 getBook 에 Function 오브젝트가 생성되면서, 반환 값인 "책 1"이 getBook 에 값으로 할당이 된다.
* + console 에서 이제 첫 번째 getBook 함수 호출이 가능해지고, 첫번째 getBook 오브젝트의 "책 1" 이 찍힌다.
* + 마지막으로, 두 번쨰 getBook 의 Function 오브젝트가 생성되고, 이 때, 반환 값이 "책 2"로 다시 설정된다.
*/
// 3. 함수 선언문 - 함수 호출 - 함수 표현식
function book() {
function getBook() {
return "책 1";
}
console.log(getBook());
var getBook = function () {
return "책 2";
};
}
book();
// 책 1
/**
* 1. 함수 선언문을 해석한다.
* + 첫 번째 getBook 선언문이 있으므로, 해석하고, Functio 오브젝트를 생성한다.
* 2. 변수를 초기화 한다.
* + 두 번째 getBook 변수에 undefined 가 설정하려고 했으나, 이미 초기화가 되어 있으므로 생략
* 3. 함수 코드를 실행한다.
* + 이미, 함수 선언문 해석과정에서, getBook Function 오브젝트가 생성되었으므로, getBook 함수 호출이 가능하다.
* + 결과적으로, console 에는 "책 1"이 찍힌다.
* + 마지막으로, getBook 변수에 Function 오브젝트가 생성되고, 이미 함수 선언문에서 초기화 되어있던 getBook 이라는 이름의 값이 "책 2" 반환 값을 가지는 Function 오브젝트로 변경
*/
// 4. 함수 표현식 - 함수 호출 - 함수 선언문
function book() {
var getBook = function () {
return "책 1";
};
console.log(getBook());
function getBook() {
return "책 2";
}
}
book();
// 책 1
/**
* 1. 함수 선언문을 해석한다.
* + 마지막에 존재하는 getBook 함수 선언문으로 인해, 반환 값을 "책 2"로 하는 Function 오브젝트가 생성
* 2. 변수 초기화
* + 첫 부분의 변수, getBook 이름에 undefined 값을 할당하려고 했으나, 이미 "값" 이 존재하므로 생략
* 3. 함수 코드 실행
* + 첫 부분의 getBook 변수의 반환 값이 "책 1"인 Function 오브젝트가 생성되면서, 이를 getBook 이라는 이름의 값으로 할당
* + console 에서 호출하는 getBook은 첫 부분의 getBook 변수의 Function 오브젝트의 함수를 호출하고, 이는 "책 2" 를 반환
*/