원인, 일반적인 객체지향 언어에서 this는 클래스에서만 사용할 수 있음. 클래스로 생성한 인스턴스 객체를 의미함. 그러나 js는 어디서든 사용할 수 있고 상황에 따라 this가 바라보는 대상이 달라짐. 함수와 객체(메서드)의 기준이 느슨한 js에서 this는 이 둘을 구분하는 “거의” 유일한 기능
함수가 호출되는 방식에 따라 달라짐
전역 공간에서
전역 객체
개념상 전역 컨텍스트를 생성하는 주체가 전역 객체이기 때문
자바스크립트 런타임 환경에 따라 다른 이름과 정보를 가지고, 브라우저 환경에서는 window, Node.js 환경에서는 global
// browser 환경
console.log(this === window) // true
// Node.js 환경
console.log(this === global) // true
특이한 점
메서드로서 호출할 때 그 메서드 내부에서의 this
함수로서 호출할 때 그 함수 내부에서의 this
콜백함수를 호출할 때 그 함수 내부에서의 this
배열.forEach(v⇒ { console.log(this); }) // 전역객체
const $div = document.querySelector("#root");
$div.addEventListener("click", function () {console.log(this);}); // $div
바꾸는 법
화살표 함수는 왜?
메서드 내부에서의 this의 경우에서의 혼란을 줄여줌
== bind 필요없이 스코프 체인 상 가장 가까운 객체를 따라감
ex)
// 선언식
var obj1 = {
outerFunc: function () {
console.log(this);
var innerFunc = function () {
console.log(this);
};
innerFunc(); // window
// 선언식 바인딩 하려면
var boundInnerFunc = function () {
console.log(this);
}.bind(this);
boundInnerFunc(); // obj1;
}
}
obj1.outerFunc(); // obj1
// 표현식 (화살표함수)
var obj1 = {
outerFunc: () => {
console.log(this);
var innerFunc = () => {
console.log(this);
};
innerFunc(); // obj1
}
}
obj1.outerFunc(); // obj1