this - JavaScript | MDN
JavaScript에서 함수의 this 키워드는 다른 언어와 조금 다르게 동작합니다. 또한 엄격 모드와 비엄격 모드에서도 일부 차이가 있습니다.
developer.mozilla.org
자바스크립트에서 함수의 `this` 키워드는
다른 언어와 조금 다르게 동작합니다.
대부분의 경우 `this`의 값은 함수를 호출한 방법에 의해 결정됩니다.
실행중에는 할당으로 설정할 수 없고,
함수를 호출할 때 마다 다를 수 있습니다.
const test = {
prop: 42,
func: function () {
return this.prop;
},
};
console.log(test.func());
// Expected output: 42
실행 컨텍스트의 프로퍼티는 비엄격 모드에서 항상 객체를 참조하며,
엄격 모드에서는 어떠한 값이든 될 수 있습니다.
전역 실행 맥락에서 `this`는 엄격 모드 여부에 관계 없이 전역 객체를 참조합니다.
// 웹 브라우저에서는 window 객체가 전역 객체
console.log(this === window); // true
a = 37;
console.log(window.a); // 37
this.b = "MDN";
console.log(window.b); // "MDN"
console.log(b); // "MDN"
함수 내부에서 `this`의 값은 함수를 호출한 방법에 의해 좌우됩니다.
function f1() {
return this;
}
// 브라우저
f1() === window; // true
// Node.js
f1() === global; // true
이 예제는 엄격 모드가 아니며 `this`의 값이 호출에 의해 설정되지 않으므로,
기본값으로 브라우저에서는 `window`인 전역 객체를 참조합니다.
반면에, 엄격 모드에서 `this` 값은 실행 문맥에 진입하며 설정되는 값을 유지하므로
다음 예시에서 보여지는 것 처럼 `this`는 `undefined`로 남아있습니다.
function f2() {
"use strict"; // 엄격 모드 참고
return this;
}
f2() === undefined; // true
두번째 예제에서 `f2`를 객체의 메서드나 속성으로써가 아닌 직접 호출했기 때문에 `this`는 `undefined` 여야 합니다.
그러나 엄격 모드를 처음 지원하기 시작한 초기 브라우저에서는 구현하지 않았고, `window` 객체를 잘못 반환했습니다.
[ 화살표 함수의 `this` ]
화살표 함수에서 `this`는 자신을 감싼 정적 범위입니다, 전역 코드에서는 전역 객체를 가리킵니다.
var globalObject = this;
var foo = () => this;
console.log(foo() === globalObject); // true
어떤 방법을 사용하든 `foo`의 `this`는 생성 시점의 것으로 설정됩니다. (위 예시에서는 global 객체)
다른 함수 내에서 생성된 화살표 함수에도 동일하게 적용됩니다.
`this`는 싸여진 렉시컬 컨테스트의 것으로 유지됩니다.
[ 객체의 메서드로서 `this` ]
함수를 어떤 객체의 메서드로 호출하면 `this`의 값은 그 객체를 사용합니다.
다음 예제에서 o.f()를 실행할 때, `o` 객체가 함수 내부의 `this`와 연결됩니다.
var o = {
prop: 37,
f: function () {
return this.prop;
},
};
console.log(o.f()); // 37
그리고 또 여러 `this` ...
- 객체의 프로토타입 체인에서의 `this`
- 접근자와 설정자의 `this`
- 생성자로서 `this`
- DOM 이벤트 처리기로서 `this`
- 인라인 이벤트 핸들러에서 `this`
등 여러 활용 예제가 MDN Docs에 제시되어 있습니다.
this - JavaScript | MDN
JavaScript에서 함수의 this 키워드는 다른 언어와 조금 다르게 동작합니다. 또한 엄격 모드와 비엄격 모드에서도 일부 차이가 있습니다.
developer.mozilla.org
MDN Docs를 참고하여 작성된 게시글입니다.
'위클리 페이퍼' 카테고리의 다른 글
리액트가 렌더링하는 과정에 대해 (1) | 2025.02.19 |
---|---|
렉시컬 스코프의 개념과 특성 (0) | 2025.02.17 |
var, let, const를 설명하기 (모던 자바스크립트) (1) | 2025.02.04 |
브라우저의 동작 방식 요약 (MDN Docs) (1) | 2025.02.04 |
웹의 동작 방식 요약 (MDN Docs) (0) | 2025.02.04 |