대부분의 객체 지향언어에서의 tihis는 클래스로 생성된 인스턴스 객체를 의미함 다른말로하면 클래스애서만 사용할 수 있다고 할수 있음 그렇지만 자바스크립트에서의 this는 클래스 외 어디에서든지 사용할 수 있다.
전역공간에서의 this는 당연스럽게도 전역객체를 가리키는 것임
전역객체는 자바스크립트 런타임 환경에 따라 다른 이름 정보를 갖고있음과 동시에 브라우저 환경에서 전역객체는 윈도우, 노드제이에스 환경에서는 글로벌임
메서드로서 호출할 때 그 메서드 내부에서의 this
함수 vs. 메서드
함수를 호출할 때, 함수명 앞에 객체명을 명시하는 경우에는 이 함수는 메서드에 해당함
함수는 그 자체로서 독립적인 기능을 수행하는 반면에 메서드는 자신을 호출한 대상 객체에 관한 동작을 수행함
var func = function (x) {
console.log(x);
}
func('Function');
var obj = {
method: func
}
obj.method('Method');
obj['method']('Method');
메서드 내부에서의 this
this에는 호출한 주체에 대한 정보가 담긴다. 어떤 함수를 메서드로서 호출하는 경우 호출 주체는 바로 함수명앞의 객체임
var obj = {
methodA: function () { console.log(this); },
inner: {
methodB: function () { console.log(this); }
}
};
obj.methodA();
obj['methodA']();
obj.inner.methodB();
obj.inner['methodB']();
obj['inner'].methodB();
obj['inner']['methodB']();
함수로서 호출할 때 그 함수 내부에서의 this
함수 내부에서의 this
어떤 함수를 함수로서 호출할 경우에는 this가 지정되지 않는데, 이러한 경우에는 this가 전역 객체를 바라봄 이에 대해서 더글라스 크락포트는 자바스크립트의 설계상의 오류라고 지적하였다고 함
그 이유는 this는 호출한 주체에 대한 정보가 담기는게 원칙인데, 위의 경우에는 호출한 주체가 없기 때문임
var obj1 = {
outer: function() {
console.log(this); // (1)
var innerFunc = function () {
console.log(this); // (2), (3)
}
innerFunc();
var obj2 = {
innerMethod: innerFunc
};
obj2.innerMethod();
}
};
obj1.outer();
바인딩은 문자그대로 묶는것이다.
모든프로그래밍과정에서 빌드 컴파일, 실행전까지 각각의 단계에서 필요한 다른 바식의 바인딩 기법이 적용된다.
이러한 방식에 따라 정적 바인딩과 동적 바인딩 두가지로 나뉘는데
정적바인딩은 프로그램 내부의정의 해주는 곳과 구현을해주는 곳을 기본으로 해당프로그램이 사용할 하드웨어 및 소프트웨어 자원을 미리 모두 예측 가능한 상태에서 자원의 할당을 요청하는 것을 정적바인딩이라고함
동적 바인딩은 프러그램내부의 정의해주는 곳과 구현해주는 곳을 바탕으로 해도 해당 프로그램이 사용하게될 자원의 양을 예측을 할 수 없는상태임, 대신에 차후에 추가 요청을 할 수 있도록 준비하고 필요에맞게 요청하는 것을 동적바인딩이라고함 /!!!