this는 무엇인가

고먐미·2023년 4월 2일
0

this 란 ?

  • 자신이 속한 객체나 생성할 인스턴스를 가리키는 변수입니다.
  • 이 때, this 는 호출 방법에 따라 결정됩니다. (이 부분이 C++, JAVA 등의 클래스 기반 언어와 다름)
  • 즉, this 는 동적으로 결정됩니다.

바인딩이란?
this 가 특정 객체와 연결되어 고정되는 과정

인스턴스란?
클래스에 소속된 개별적인 객체

전역에서 사용된 경우

  • 전역 실행 맥락에서는 전역 객체를 참조합니다.
  • 웹 브라우저에서는 window 객체가 전역 객체이므로 window를 참조합니다.

함수에서 사용된 경우

  • 함수를 호출한 방법에 의해 결정됩니다.
  1. 일반 함수 호출
    기본적으로 전역 객체가 바인딩 됩니다.
    ( 어떠한 함수라도 일반 함수로 호출되면 this에 전역 객체가 바인딩 됩니다. )
    하지만 strict mode 에서는 함수 내 default binding이 없기 때문에 uindefined 라는 값이 나옵니다.

  2. 메서드 호출
    메서드를 호출할 때 메서드를 쓰기 전 기술한 객체가 바인딩 됩니다.
    ( 예를들어 예시.메서드 일 때, 예시 가 바인딩 됩니다. )

    주의!
    메서드 내부의 this는 메서드를 소유한 객체가 아닌 메서드를 호출한 객체에 바인딩 됩니다.

  3. 생성자 함수 호출
    생성자 함수가 생성할 인스턴스가 바인딩 됩니다.
    즉, 미래에 생성될 인스턴스가 바인딩 된다는 의미입니다.

  4. apply, call, bind 메서드에 의한 간접 호출
    apply, call, bind 메서드에서 첫 번째 인수로 전달한 객체가 바인딩 됩니다.

this 를 명시적으로 바인딩 해주는 call(), apply(), bind()

  • apply(), call()
    첫 번째 인자를 this로 바인딩하고, 두 번째 인자를 함수의 인자로 전달합니다.
    이 때, 두 번째 인자를 처리하는 방식에서 apply()call() 의 차이가 생깁니다.
    • apply()
      두 번째 인자를 배열의 형태로 받아 함수로 전달합니다.
      즉, 함수에게 배열이나 유사 배열 객체로 전달합니다.
    • call()
      리스트 형식으로 두 번째 인자를 함수로 전달합니다.
  • bind()
    첫 번째 인자를 바인딩하고, 새로운 함수를 반환합니다.
    반환한 함수를 실행해야 원본 함수가 실행됩니다.
    내부의 중첩 함수나 콜백함수의 this가 일치하지 않는 경우의 해결방법으로 쓰입니다.
  1. 화살표 함수 호출
    자신을 참조하는 this를 만들지 않습니다.
    대신 함수가 선언된 스코프에서의 this를 상속합니다.
    즉, 상위 스코프의 this를 참조합니다.

this가 동작하는 원리와 용법을 아는대로 설명해주세요

this 란, 자신이 속한 객체나 생성할 인스턴스를 가리키는 변수입니다.
이 때, this 는 호출 방법에 따라 동적으로 결정되는데 이 부분이 다른 언어 (JAVA, C++ 등)와 다른 부분입니다.

전역에서의 호출, 일반 함수에서의 호출, 화살표 함수에서의 호출에 따라 다르게 동작하며, 메서드에서의 호출이나 생성장에서의 호출에서도 다르게 동작합니다.

어떻게 다르게 동작하나요?
전역에서 호출될 경우에는 window를 참조합니다. ( 웹 브라우저의 경우 )
일반 함수에서 호출될 경우에도 역시 window를 참조합니다. 하지만 strict mode 일 경우, 함수 내의 default binding이 없기 때문에 undefined 값이 나옵니다.
화살표 함수에서 호출될 경우에는 자신을 참조하는 this를 만들지 않고, 함수가 선언된 스코프, 즉 상위 스코프의 this를 참조합니다.
메소드에서 호출될 경우에는 메서드를 호출할 때 메서드를 쓰기 전 기술한 객체가 바인딩됩니다.
생성자 함수에서 호출될 경우에는 생성자 함수가 생성할 인스턴스가 바인딩됩니다.

그렇다면 this를 명시적으로 바인딩할 수는 없나요?
apply, call, bind 메서드를 통해 명시적으로 바인딩이 가능합니다.

profile
개념을 이해하고 다른사람에게도 알려줄 수 있는 개발자가 되고 싶어요..

0개의 댓글