this

this

this는 객체 자신의 프로퍼티나 메소드를 참조하기 위한 자기 참조 변수(Self-referencing variable)이다.

함수 호출 방식과 this 바인딩

this에 바인딩될 객체는 함수의 호출방식, 즉 함수가 어떻게 호출되었는지에 따라 동적으로 결정된다.

함수를 호출하는 방식은 다양하다.

  • 일반 함수 호출
  • 메소드 호출
  • 생성자 함수 호출
  • Function.prototype.apply/call/bind 메소드에 간접 호출

일반 함수 호출

기본적으로 this에는 전역 객체(Global object)가 바인딩된다.

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

그러나 this는 객체의 프로퍼티나 메소드를 참조하기 위한 자기 참조 변수이므로 객체와는 관계없는 일반 함수에서는 this가 의미가 없다.

메소드 내에서 정의한 중첩 함수라도 일반 함수로 호출되면 중첩 함수 내부의 this에는 전역 객체가 바인딩된다.

콜백 함수 내부의 this에도 전역 객체가 바인딩된다.

어떤 함수라도 일반 함수로 호출되면 this에는 전역 객체가 바인딩된다.

메소드 호출

메소드 내부의 this는 메소드를 호출한 객체, 즉 메소드 이름 앞 마침표 연산자 앞에 기술한 객체에 바인딩된다.

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

이는 메소드 내부의 this가 메소드를 소유한 객체와는 관계없이 메소드를 호출한 객체에 바인딩되는 것으로 프로토타입 메소드 내부에 사용된 this도 일반 메소드와 동일하게 호출한 객체에 바인딩된다.

생성자 함수 호출

생성자 함수 내부의 this에는 생성자 함수가 생성할 인스턴스가 바인딩된다.

일반 함수와 동일한 방법으로 생성자 함수를 정의하고 new 연산자와 함께 호출하면 해당 함수는 생성자 함수로 동작한다. 만약 new 연산자와 함게 생성자 함수를 호출하지 않으면 생성자 함수가 아닌 일반 함수로 호출한다.

Function.prototype.apply/call/bind 메소드

apply와 call 메소드는 본질적은 기능은 함수를 호출하는 것이다.

bind 메소드는 apply와 call 메소드와는 달리 함수를 호출하지 않고 this로 사용할 객체만을 전달한다.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×