TIL 30 | JS(this)

YB.J·2021년 7월 10일
0
post-thumbnail

모던자바스크립트 Deep Dive에서 발췌한 this에 관한 내용을 적어보자

this

this 키워드

  • 메서드 : 동작을 나타냄. 자신이 속한 객체의 상태, 즉 프로퍼티를 참조하고 변경할 수 있어야 함. 먼저 자신이 속한 객체를 가리키는 식별자를 참조할 수 있어야 한다
  • this
    1. 자신이 속한 객체 또는 자신이 생성할 인스턴스를 가리키는 자기 참조 변수
    2. this를 통해 자신이 속한 객체 또는 자신이 생성할 인스턴스의 프로퍼티나 메서드를 참조할 수 있음
    3. this가 가리키는 값, 즉 this 바인딩은 함수 호출 방식에 의해 동적으로 결정됨

this 바인딩
바인딩이란 식별자와 값을 연결하는 과정. 예를 들어, 변수 선언문은 변수 이름(식별자)과 확보된 메모리 공간의 주소를 바인딩하는 것이다. this 바인딩은 this(키워드로 분류되지만 식별자 역할을 한다)와 this가 가리킬 객체를 바인딩 하는 것이다.


const circle = {
  radius: 5,
  getDiameter() {
    return 2 * this.radius;
  }
};

console.log(circle.getDiameter()); // 10
  • 객체 리터럴의 메서드 내부에서의 this는 메서드를 호출한 객체, 즉 circle을 가리킨다

// 생성자 함수
funciton Circle(radius) {
  this.radius = radius;
} 

Circle.prototype.getDiameter = function () {
  return 2 * this.radius;
};

const circle = new Circle(5);
console.log(circle.getDiameter()); //10
  • 생성자 함수 내부에서의 this는 생성자 함수가 생성할 인스턴스를 가리킨다. 이처럼 this는 상황에 따라 가리키는 대상이 다르다.
  • this는 객체의 프로퍼티나 메서드를 참조하기 위한 자기 참조 변수이기 때문에 일반적으로 객체의 메서드 내부 또는 생성자 함수 내부에서만 의미가 있다.

함수 호출 방식과 this 바인딩

  • this 바인딩(this에 바인딩될 값)은 함수 호출 방식, 즉 함수가 어떻게 호출되었는지에 따라 동적으로 결정된다

렉시컬 스코프와 this 바인딩은 결정 시기가 다르다
함수의 상위 스코프를 결정하는 방식인 렉시컬 스코프는 함수 정의가 평가되어 함수 객체가 생성되는 시점에 상위 스코프를 결정한다. 하지만 this 바인딩은 함수 호출 시점에 결정된다

  • 함수를 호출할 수 있는 방식
    1. 일반 함수 호출 : 기본적으로 this에는 전역 객체가 바인딩된다. 일반 함수로 호출하면 함수 내부의 this에는 전역 객체가 바인딩된다.
    2. 메서드 호출 : 메서드를 호출한 객체
    3. 생성자 함수 호출 : 생성자 함수가 (미래에) 생성할 인스턴스
    4. Function.prototype.apply/call/bind 메서드에 의한 간접 호출 : Function.prototype.apply/call/bind 메서드에 첫번째 인수로 전달한 객체
profile
♪(^∇^*) 워-후!!(^∀^*)ノシ

0개의 댓글