
실행 컨텍스트(Execution Context)
- 실행 컨텍스트란 코드가 실행 될 때 환경 정보들을 모아둔 객체입니다
- 실행 컨텍스트는 Last-In-First-Out인 Call Stack에 쌓아 올려지며 실행이 완료되면 빠지게 됩니다
- 코드의 환경과 순서를 보장합니다

Active Context: 전역 -> A 함수 -> B 함수 -> A 함수
Acitve한 컨텍스트는 콜스택 맨 위의 컨텍스트 입니다
현재 실행 컨텍스트에서 필요한 값을 찾고 없으면 하위 컨텍스트로 이동하며
전역 실행 컨텍스트까지도 찾지 못하면 에러를 발생시킵니다
실행 컨텍스트는 스택에서 제거되도 메모리에서 바로 제거되지 않는데, 추후에 참고해야 할 수도 있기 때문입니다
Garbage Collector가 지켜보다가 더 이상 사용되지 않으면 자동으로 삭제해 줍니다
This
this 바인딩은 실행 컨텍스트에 따라 결정됩니다
함수를 호출한 컨텍스트를 가리키며 함수가 실행 될 때 함수 내부에서 사용됩니다
var a = 1;
console.log(a); // 출력: 1
console.log(this.a); // 출력: 1
- this는 부르는 상황마다 다르게 동작합니다
- this 바인딩 우선순위: new 바인딩 > 암시적 바인딩 > 명시적 바인딩 > 기본 바인딩
기본 바인딩
- 함수에서 단독 호출 시에는 Global Binding
// 단독 호출 전역 실행 컨텍스트
function thisFunc(){
console.log(this);
}
thisFunc(); // 전역 객체 또는 undefined(엄격 모드)
암시적 바인딩
- 객체에 메서드로 함수가 호출될 때 'this'는 그 객체에 바인딩됩니다
- Object 내부에서 쓰면 자기 자신을 나타냅니다
const obj = {
name: 'Judy',
getName(){
return this.name;
}
}
console.log(obj.getName()); // 출력: Judy
명시적 바인딩
apply / call
- 함수 호출 시 첫번째 인자로 this로 사용할 객체를 전달합니다
- 두 함수는 동작 방식이 동일하나 인수 전달의 차이가 있습니다
- 사용 즉시 호출, 무기명 호출
function introduce(name, interest) {
console.log(`Hello! My name is ${name} and I like ${interest}.`);
}
const user = {
name: 'Judy',
interest: 'JavaScript'
};
// call 사용
introduce.call(user, user.name, user.interest);
// apply 사용
introduce.apply(user, [user.name, user.interest]); // 배열로 인자값들을 넘겨준다
bind
- 첫번째 인자값을 전달된 객체에 this를 고정한 새로운 함수(익명 함수)를 반환합니다
- 일급함수로서 리턴됩니다
- 이 함수를 필요에 따라 재사용 할 수 있습니다
function greet() {
console.log(`Hi, I am ${this.name}.`);
}
const user = {
name: 'Maie'
};
// bind 사용
const userGreet = greet.bind(user);
userGreet();
new 바인딩
- 생성자 함수를 사용하여 새로운 객체를 생성할 때 발생하는 바인딩입니다
- 'new' 키워드와 함께 호출할 때, 생성되는 새 객체에 'this'가 바인딩 됩니다
function Person(name, age) {
this.name = name;
this.age = age;
}
const student1 = new Person('Judy', 25);
console.log(alice); // Person { name: 'Judy', age: 25 }
화살표 함수 this
- 함수가 호출되는 방식에 따라 this가 결정됩니다
- 화살표 함수가 선언될 당시의 상위 Scope 의 this를 참조합니다
- this 바인딩 자체가 없기 때문에 call, apply, bind 모두 사용 불가능합니다
const obj = {
name : 'Judy',
getName: () => {
return this.name; // obj가 아닌 Global을 반환
}
}
console.log(obj.getName());
'자바스크립트' 카테고리의 다른 글
자바스크립트 런타임과 엔진 구성, 자바스크립트 엔진의 비동기 처리 (0) | 2024.05.02 |
---|---|
자바스크립트 - 기본자료형, 참조자료형, 깊은 복사, 얕은 복사, Object.assign() (1) | 2024.04.16 |
자바스크립트 - 객체, 프로퍼티, key, value, 메서드 (0) | 2024.04.04 |
자바스크립트 - 함수, 순수함수, 일급함수, 호이스팅, var 호이스팅 (2) | 2024.03.29 |
자바스크립트 - 변수, var, const, let, 선언, 할당, 초기화, 렉시컬 스코프, 스코프 체인 (1) | 2024.03.28 |