this의 5가지 binding 패턴 복습 (jd1386님의 정리)
// this 는 함수를 어떻게 호출(선언x)하느냐에 따라
// this에 할당되는 객체가 달라진다.
// 다음과 같은 함수가 있다고 가정할 때
var foo = function() {
console.log(this);
}
// 1. 글로벌 호출(Global reference)
console.log(this) // => 전역 객체인 window를 가리킨다.
// 2. 함수 호출(Function invocation Pattern)
foo(); // => foo()와 같이 함수 호출을 할 경우 해당 함수의 스코프인 전역 스코프에서 this인 window 객체를 가리킨다.
사실상 window.foo()이기 때문에(메소드 invocation과 같은 이야기)
// 3. 메소드 호출 패턴(Method Invocation pattern)
// 객체의 메소드로 호출되면 this는 해당 객체를 가리킨다.
var obj = {
name: "Jungdo",
sayName: function() {
console.log(this.name);
}
}
// 위의 객체 obj에서 sayName이라는 메소드를 만들어주고 obj.sayName()을 실행하면 this의 대상을 찾아 (obj), 객체 obj의 name을 프린트한다.
// object의 key 안에 value값으로 function이 존재하고, 이를 호출하는 것을 method 호출이라 한다. 이러한 경우, this는 부모 object를 그 값으로 한다. (호연님 정리)
// 4. 생성자 호출 패턴(Construction mode)
// 객체의 인스턴스(instance)를 만들시 (Construction)
// 객체의 this는 새로 생성된 instance를 가리킨다.
// 다음과 같이 placeholder로 많이 사용된다.
var Car = function(name, year) {
this.name = name,
this.year = year
}
var benz = new Car('benz', '2012');
console.log(benz); // => { name: 'benz', year: '2012' }
// 5. Call or Apply(Apply Invocation Pattern)
// call이나 apply 메서드를 써서 지칭하고자 하는 this의 대상을 분명하게 명시해줄 수 있다. 이럴 때는 첫번째 인자가 this이다.
var obj = {
name: "Jungdo"
}
foo.call(obj) // => 첫번째 인자 obj가 this가 된다.
foo.apply(obj) // => 첫번째 인자 obj가 this가 된다.
// jd1386님의 훌륭한 설명을, 제 자신이 이해 할 수 있도록 약간 수정했습니다.