// 스택은 후입선출
// ---- 1) 코드실행 2) 전역 in (첫번째 스택)
var a = 1;
function first() { // ---- 3) 전역 중단 + first in (두번째 스택)
function second() { // ---- 4) first 중단 + second in (세번째 스택)
console.log(a); //undefined
var a = 3;
}
second(); // ---- 5) second out + first 재개 (세번째 스택 out)
console.log(a); // 1 출력 (세번째 스택은 나갔고, 두번째 스택에는 a를 지정해주지않아 전역에서 가져옴)
}
first(); // 6) ---- first out + 전역 재개 (두번째 스택 out)
console.log(a);// 1 출력
// ---- 7) 전역 out (세번째 스택 out) 8 코드 종료
1) 코드실행
2) 전역(in)
3) 전역(중단) + first(in)
4) first(중단) + second(in)
5) second(out) + first(재개)
6) first(out) + 전역(재개)
7) 전역(out)
8) 코드종료
생성 시점. 즉, 활성화 시점에 JS 엔진은 해당 컨텍스트에 관련된 코드를 실행하는데 필요한 환경 정보들을 수집해서 실행 컨텍스트 객체에 저장
function a (x) {
console.log(x); // var x;
var x; // var x;
console.log(x); // => var x;
var x = 2; // x = 1;
console.log(x); // console.log(x) 1출력
} // console.log(x) 1출력
a(1) // x = 2;
// console.log(x) 2출력
//함수 선언의 호이스팅
function a () {
console.log(b); // [function: b] 출력
var b = 'bbb';
console.log(b); // bbb 출력
function b() { }
console.log(b); // bbb 출력
}
a();
function a () { /* ... */ } // 함수 선언문. 함수명 a가 곧 변수명
a(); // 실행 ok
var b = function () { /* ... */ } // (익명 함수 표현식. 변수명 b가 곧 변수명
b(); // 실행 ok
var c = function d () { /* ... */ } // 기명 함수 표현식. 변수명은 c, 함수명은 d
c(); // 실행 ok
d(); // 에러!
console.log(sum(1, 2)); // 3 출력
console.log(multiply(3, 4)); // 에러남
function sum (a, b) { // 함수 선언문 sum
return a + b;
}
var multiply = function (a, b) { // 함수 표현식 multiply
return a + b;
}