본문 바로가기
TIL

[TIL] THIS

by 쾌횽 2024. 1. 3.
반응형

 

🧐 THIS

자바스크립트는 Lexical Scope를 사용하기때문에 함수의 상위 스코프가 정의 시점에 평가된다.

하지만 this 키워드는 바인딩이 객체가 생성되는 시점에 결정된다.

 

우리가 단순히,

const testFunction = function () {
  return this;
};
console.log(testFunction()); // Object [global]

일반함수로 실행을 하면 this키워는 global Object에 매핑된다.

 

this를 여러기지로 매핑해보면,

const developer = {
  name: "박재형",
  year: 1992,
  sayHello: function () {
    return `안녕하세요 저는 ${this.name}입니다.`;
  },
};
console.log(developer.sayHello()); // 안녕하세요 저는 박재형입니다.

 

여기서 this.name은 현재 객체를 의미 한다.

this.name을 출력하면 developer.name이 출력된다.

function Person(name, year) {
  this.name = name;
  this.year = year;

  this.sayHello = function () {
    return `안녕하세요 저는 ${this.name}입니다.`;
  };
}
const developer2 = new Person("박재형", 1992);
console.log(developer2.sayHello()); // 안녕하세요 저는 박재형입니다.

 

또 생성자 함수에 new 키워드를 통해 파라미터에 값을 넣어주면 똑같은 값이 나오는 것을 확인할 수 있다.

Person.prototype.backEnd = function () {
  return `${this.name}은 백엔드 개발자 입니다.`;
};
console.log(developer2.backEnd()); // 박재형은 백엔드 개발자 입니다.

prototype에 backEnd라는 함수를 정의해주어도 this키워드는 우리가 실행하는 객체로 잘 매핑된다.

그런데,

Person.prototype.backEnd = function () {
  function frontEnd() {
    return `${this.name}은 백엔드 개발자 입니다.`;
  }
  return frontEnd();
};
console.log(developer2.backEnd()); // undefined은 백엔드 개발자 입니다.

내부에 frontEnd함수를 하나 더 만들고 내부로 this키워드를 옮긴다음 실행해 보면,  this키워드가 undefined로 매핑이 되었다.

이처럼, 객체의 매서드로 함수로, 즉 가장 상위 레벨로 함수를 선언하면 this는 자동으로 실행하는 대상 객체로 매핑되지만, 그 외의 위치에 함수를 선언하게 되면 this는 global에 매핑이 된다.

 

**this 키워드가 어떤걸 타겟하냐는 세가지만 가억하면된다.

  • 일반 함수 호출할땐 this가 최상위 객체 (global 또는 window)를 나타낸다.
  • 매서드로 호출할땐 호출된 객체를 나타낸다.
  • new키워드를 사용해서 객체를 생성했을땐 객체를 나타낸다.

 

**this 키워드를 원하는 값으로 매핑하기

  • call()
  • apply()
  • bind()
function returnName() {
  return this.name;
}
console.log(returnName());

const developer3 = {
  name: "박재형",
};
// returnName함수의 this는 글로벌 즉, undifined이다. 이를 박재형으로 매핑
console.log(returnName.call(developer3)); // 박재형
console.log(returnName.apply(developer3)); // 박재형

 

call()과  apply() 차이

  • call()은 컴마(,)를 기반으로 아규먼트를 순서대로 넘겨준다
  • apply는 아규먼트를 리스토로 입력해야한다.
function multiply(x, y, z) {
  return `${this.name} / 결과값: ${x * y * z}`;
}
console.log(multiply.call(developer3, 3, 4, 5)); // 박재형 / 결과값: 60
console.log(multiply.apply(developer3, [3, 4, 5])); // 박재형 / 결과값: 60

 

bind()

call()과 apply()는 실행하는 순간 바로 계산되지만, bind() this를 바인딩만 시켜놓고 나중에 실행 할 수 있다.

const laterFunc = multiply.bind(developer3, 3, 4, 5);
console.log(laterFunc); // [Function: bound multiply]
console.log(laterFunc()); // 박재형 / 결과값: 60

 

 


참고자료

코드팩토리 유튜브

반응형

'TIL' 카테고리의 다른 글

[TIL] Git & Github로 협업하기  (1) 2024.01.09
[TIL] 초간단 Git 기본 사용법  (0) 2024.01.08
[TIL] 스코프 (Scope)  (1) 2024.01.02
[TIL] 자바스크립트 기본 문법 숙제  (1) 2023.12.29
[TIL] SQL과 기본쿼리 3  (1) 2023.12.27

댓글