브라우저에서 this는 Window 객체를 가르킨다.
그리고 Node에서 this는 global 객체를 가르킨다. (정확히는 최상위에서 호출 시 module.exports / exports를 가르키고, 함수 내부에서 호출 시 global 객체를 가르킨다)
이렇게 this는 환경에 따라서 다른 객체를 가르킨다.
선언식 함수
이는 function 선언식에서도 다르지 않는데,
this는 함수의 호출, 실행 단계에서 동적으로 결정된다.
// 브라우저
function test1() {
return function consoleA() {
console.log(this);
}
}
const test3 = test1();
test3(); // Window 객체
function test2() {
console.log(this);
}
test2(); // Window 객체
일단 기본적으로 함수 선언식의 내부 this는 무조건 Window 객체를 가르킨다.
함수 선언식으로 생성된 함수는 window객체 내부에 할당되기 때문이다.
const user = {
name: "park",
callName: function() {
console.log(this);
}
}
user.callName(); // {name: 'park', callName: ƒ}
객체 내부에 선언식 함수가 들어가면, 이때 this는 user 객체를 가르킨다.
const user = {
name: "park",
callName: function() {
return function () {
console.log(this);
}
}
}
const test = user.callName();
test(); // Window
만약 클로저 함수를 만들어 this를 출력하면, 다시 window 객체를 가지는 것을 확인할 수 있다.
this의 위치는 객체 내부 함수에 있지만, 호출되는 위치를 기반으로 this의 참조가 결정되었다.
선언되는 위치는 this의 값과 관계가 없다.
누가 호출했냐에 따라서 this의 값은 변경될 수 있다.
function sayHello() {
console.log('Hello ' + this.name);
}
const person = {
name: 'Alice',
greet: sayHello,
};
person.greet(); // Hello Alice
선언식 함수에서 this를 원하는 곳에 연결시키기 위해서는 bind 메서드를 사용한다.
🍈 bind는 ECMAScript 5에서 추가된 문법이다.
function callThis() {
console.log(this);
}
const user = {
name: "park",
}
callThis(); // Window
callThis.bind(user)(); // user 객체
화살표 함수
이렇게 선언식 함수에서 this는 동적으로 결정된다.
반면에, 화살표 함수는 this의 바인딩이 정적으로 결정되어 항상 상위 스코프를 가르키게 된다.
const user = {
name: "park",
callName: () => {
console.log(this);
}
}
user.callName(); // Window
위의 화살표 함수의 this는 Window 객체를 반환한다. 선언식 함수에서는 user 객체를 출력한 것과는 대조적이다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/this
this - JavaScript | MDN
JavaScript에서 함수의 this 키워드는 다른 언어와 조금 다르게 동작합니다. 또한 엄격 모드와 비엄격 모드에서도 일부 차이가 있습니다.
developer.mozilla.org
'JavaScript' 카테고리의 다른 글
자바스크립트 최단거리 알고리즘 (다익스트라 알고리즘, Dijkstra) (0) | 2023.06.28 |
---|---|
webpack의 기초에 대해서 알아보기 (0) | 2023.06.17 |
Yarn berry 사용하기 (0) | 2023.05.13 |
Proxy 사용하기 (0) | 2023.05.12 |
HTML 화면 스크린샷 찍기 (html2canvas) (0) | 2023.05.04 |