[JS Basic] this

재오·2022년 11월 7일
1

JavaScript

목록 보기
16/48
post-thumbnail

this 전반적 이해

this는 자신이 속한 객체 또는 자신이 생성할 인스턴스를 가리키는 자기 참조 변수이다. this를 통해 자신이 속한 객체 또는 자신이 생성할 인스턴스의 프로퍼티나 매서드를 참조할 수 있다.

우리가 함수를 호출하게 되면 arguments 객체와 this가 암묵적으로 함수 내부에 전달된다. this도 지역 변수처럼 사용할 수 있다. 즉 this 바인딩은 함수 호출 방식에 의해 동적으로 결정된다.

자바스크립트의 this는 함수가 호출되는 방식에 따라 this에 바인딩될 값, 즉 this 바인딩이 동적으로 결정된다.

  • 전역에서 this는 전역 객체를 가리킨다.
  • 매서드 내부에서 this는 매서드를 호출한 객체를 가리킨다.
  • 생성자 함수 내부에서 this는 생성자 함수가 생성할 인스턴스를 가리킨다.
  • strict mode가 적용된 일반 함수 내부의 this는 undefined가 바인딩된다.

함수 호출 방식과 this 바인딩

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

- 일반 함수 호출

일반함수로 호출하면 함수 내부의 this에는 전역 객체가 바인딩 된다.

this는 객체의 프로퍼티나 매서드를 참조하기 위한 자기 참조 변수이므로 객체를 생성하지 않는 일반 함수에서 this 는 아무 의미 없다.

매서드 내에서 정의한 중첩 함수나 콜백 함수도 일반 함수의 형태를 띄기 때문에 매서드 안에 존재하는 중첩 함수나 콜백 함수도 전역 객체가 바인딩이 된다. 이렇게 된다면 외부 함수인 매서드와 중첩 함수 또는 콜백 함수의 this가 일치하지 않는다는 문제가 발생한다. 이러한 문제를 해결하기 위해 새로운 변수에 값을 할당하고 내부 함수에 적용하는 방법을 사용한다.

var value = 1;

const obj = {
  value: 100,
  foo() {
    const that = this;
    
    setTimeout(function () {
      console.log(that.value); // 100
    }, 100);
  }
};

obj.foo();

- 매서드 호출

매서드 내부의 this는 매서드를 소유한 객체가 아닌 매서드를 호출한 객체에 바인딩 된다

함수 내부에 있는 매서드는 객체에 포함되어 있는 것이 아니라 독립적으로 존재하는 별도의 객체다. 한마디로 다른 객체의 매서드가 될 수도 있고 일반 변수에 할당하여 일반함수로 호출될 수도 있다.


const person = {
  nameL 'Lee',
  getName() {
    return this.name;
  }
};

const anotherPerson = {
  name: 'Kim'
};

anotherPerson.getName = person.getName;
console.log(anotherPerson.getName()); // Kim

const getName = person.getName;
console.log(getName()); // ''

따라서 매서드 내부의 this는 프로퍼티로 매서드를 가리키고 있는 객체와는 관계가 없고 매서드를 호출한 객체에 바인딩 된다.

- 생성자 함수 호출

앞에 생성자 함수에서 살펴본 이야기와 같다. new연산자가 없으면 일반 함수로 호출이 되고 new 연산자가 붙으면 생성자 함수가 생성할 인스턴스가 바인딩 된다.

일반 함수로 호출된 Circle에는 반환문이 없으므로 암묵적으로 undefined를 반환한다.

profile
블로그 이전했습니다

0개의 댓글