컨텍스트가 문맥을 나타내는데,
실행 컨텍스트 Execution Context
란, Javascript 코드가 실행할 코드에 제공할 환경 정보들을 모아 놓는 환경을 말한다.
여기서 말하는 실행 컨텍스트가 모아놓는 정보란, 코드를 실행하기 위한 여러가지 정보를 말하는데
대표적으로 3가지 분류로 구분할 수 있다
Vairable Object
라고도 한다실행 컨텍스트도 하나의 객체로서, 객체 안에 환경 정보가 다 있기 때문에
변수, 매개변수, 인자, 함수 선언 등의 정보를 가지고 있다
Hoisting
에 의해 코드가 실행되기 전에 코드의 변수명을 모두 알고 있다스코프 체이닝
에 대한 정보를 담고 있다this로 지정된 객체가 저장된다
실행 컨텍스트가 활성화했을 때, this가 지정되지 않은 경우 this = global object
로 지정된다
함수를 호출하는 방법에 따라 this에 지정되는 객체가 다르다
호이스팅이란, 간단히 말하자면 변수의 선언부는 끌어올리고, 할당은 코드가 실행되는 시점에서 진행한다고 할 수 있겠지만
더 정확히 말하자면, 실행 컨텍스트 상에서 LexicalEnvironment 안에 이 함수가 어떻게 쓰이는지 정보를 수집하고 시작하는 현상
var x = 1;
console.log(x + " " + y); // '1 undefined'
var y = 2;
이런 상황에서 다른 프로그래밍 언어라면 y is not defined
라는 오류가 발생했겠지만,
자바스크립트에서는 호이스팅이라는 특성 덕분에 undefined
라는 값이 할당된 것을 볼 수 있다.
실제로 이렇게 작동하지는 않겠지만 이해를 돕기 위해 자바스크립트 엔진에서 처리하는 과정을 살펴보자면,
// === 호이스팅 작동 방식 ===
var x = 1; // Initialize x
var y; // Declare y
console.log(x + " " + y); // '1 undefined'
y = 2; // Initialize y
function a() { }
이러한 함수의 선언문에서 함수를 정의하기 전에 먼저 선언했는데 에러가 발생하지 않는다
catName("Chloe");
function catName(name) {
console.log("My cat's name is " + name);
}
// 위 코드의 결과는: "My cat's name is Chloe"
표현식은 자바스크립트 말고도 그 밖의 다른 프로그래밍 언어에서도 다루는 개념으로, 값이라고 생각하면 좋다
리터럴에 대한 내용은 나중에 다시 다루려 합니다
// 1. 익명함수를 변수에 할당
var a = function() { }
// const a = () => {}
// 2. 이름을 준 상태에서 변수에 할당
var b = function success() { }
a();
b();
success(); // error : b 함수 내부에서만 sucess 함수명에 접근할 수 있다
익명함수를 변수에 할당하기 전에 호출하면 사용할 수 없다
console.log(notHoisted) // undefined
notHoisted(); // TypeError: notHoisted is not a function
var notHoisted = function() {
console.log('bar');
};
x = 3;
let x = 1;
x is not defined
라는 에러를 봤겠지만,초기화하기 전에 x 변수에 접근하지 말라
는 의미의 Uncaught ReferenceError: Cannot access 'x' before initialization
라는 에러가 발생한다.var x = 'global';
function foo () {
var x = 'function scope';
console.log(x); // function scope
}
foo();
console.log(x); // global
변수가 살아있는 범위 스코프
를 기준으로 함수로 생각하자면 global x
와 foo() 내부의 x
는 다르다
window
global
var a = '안녕';
console.log(a); // 안녕
console.log(window.a); // 안녕
window
의 프로퍼티가 되기 때문에 어디에서나 접근이 가능하다함수 블록
이다. : 함수에 의해서만 스코프가 생성된다{ } 블록
이 스코프의 단위이기 때문에 특이하다{ } 블록
이 되었다.if (true) {
var x = 5;
}
console.log(x); // 5
{
let x = 1;
}
console.log(x); //Uncaught ReferenceError: x is not defined
이런 코드에서 스코프를 한정짓고 싶을 때 즉시실행함수
방식을 사용하면 된다
(function () {
var x = 5;
})();
console.log(x); // Uncaught ReferenceError: x is not defined
변수가 해당 스코프에서 유효하지 않을 때, 앞에서부터 바깥으로 차례로 검색해 나가는 것이다.
function sum() {
var a = 3
var b = 5;
function inner() {
var b = 7;
var c = 11;
a = a + b + c; // a = 3, b = 7, c = 11
console.log(a); // 21
};
console.log(a); // 3
inner();
console.log(a); // 21
};
sum();
console.log(a); // Uncaught ReferenceError: a is not defined