this 키워드 


객체는 상태를 나타내는 프로퍼티와 동작을 나타내는 메소드를 하나의 논리적인 단위로 묶은 복합적인 자료구조다.

메소드는 자신이 속한 객체의 프로퍼티를 참조하려면 먼저 자신이 속한 객체를 가리키는 식별자를 참조할 수 있어야 한다. 

 

이때 필요한게 this 다.

 

this는 자신이 속한 객체 또는 자신이 생성할 인스턴스를 가리키는 자기 참조 변수다.

this를 통해 자신이 속한 객체 또는 자신이 생성할 인스턴스의 프로퍼티나 메소드를 참조할 수 있다.

this가 가리키는 값, 즉 바인딩은 함수 호출 방식에 의해 동적으로 결정된다.  

일반 함수 내부에서 this를 사용할 필요가 없기 때문이다. 

 


일반 함수 호출 

 

 

기본적으로 this에는 전역 객체가 바인딩 된다.일반 함수로 호출하면 함수 내부의 this에는 전역 객체가 바인딩된다. 메소드 내 중첩 함수 또한 일반 함수로 호출이 되면 전역 객체가 바인딩되는 것을 볼 수 있다. 

 

 

 

메소드 호출

 

 

 

 

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

 

 

 

 

 

 

 

 

생성자 함수 호출

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

 

 

Function.prototype.apply/call/bind 메소드에 의한 간접  호출

function getThisBinding() {
  return this;
}

// this로 사용할 객체
const thisArg = { a: 1 };

console.log(getThisBinding()); // window

// getThisBinding 함수를 호출하면서 인수로 전달한 객체를 getThisBinding 함수의 this에 바인딩한다.
console.log(getThisBinding.apply(thisArg)); 			// {a: 1}
console.log(getThisBinding.call(thisArg)); 			// {a: 1}
console.log(getThisBinding.apply(thisArg, [1, 2, 3])); 		// {a: 1}
console.log(getThisBinding.call(thisArg, 1, 2, 3)); 		// {a: 1}
console.log(getThisBinding.bind(thisArg)); 			// getThisBinding
console.log(getThisBinding.bind(thisArg)());  			// {a: 1}

apply와 call 메소드의 본질적인 기능은 함수를 호출하는 것이다.  두 메소드를 사용하면 첫 번째 인수로 전달한 특정 객체를 호출한 함수의 this에 바인딩한다. 그리고 뒤에 호출한 함수의 인수를 쉼표로 구분한 리스트 형식으로 구분한다. 

bind 메소드는 함수를 호출하지 않고 첫번째 인수로 받은 값으로 바인딩을 새로하여 교체된 함수를 새로 생성해 반환을 한다.

 

함수 호출 방식 this 바인딩 
일반 함수 호출 전역 객체
메소드 호출 메소드를 호출한 객체
생성자 함수 호출 생성자 함수가 생성할 인스턴스
prototype.call,apply,bind 메소드에 의한 간접 호출 해당 메소드에 첫번째로 전달된 객체