Java
에서의 this는 인스턴스 자신(self)을 가리키는 참조변수이다.
this가 객체 자신에 대한 참조 값을 가지고 있다는 뜻이다.
주로 매개변수와 객체 자신이 가지고 있는 멤버변수명이 같을 경우 이를 구분하기 위해서 사용된다.
아래 Java 코드의 생성자 함수 내의 this.name은 멤버변수를 의미하며 name은 생성자 함수가 전달받은 매개변수를 의미한다.
하지만
자바스크립트
의 경우 Java와 같이 this에 바인딩되는 객체는 한가지가 아니라 해당 함수 호출 방식에 따라 this에 바인딩되는 객체가 달라진다.
1.
함수 호출
2.
메소드 호출
3.
생성자 함수 호출
4.
apply/call/bind 호출
EC(Execution Context)가 생성될 때마다 this의 바인딩이 일어나며 우선순위 순으로 나열해보면 다음과 같다.
1.
new 를 사용했을 때 해당 인스턴스로 바인딩된다.
var name = "global";
function Func() {
this.name = "Func";
this.print = function f() { console.log(this.name); };
}
var a = new Func();
a.print(); // Func
PHP
복사
2.
call, apply, bind 와 같은 명시적 바인딩을 사용했을 때 인자로 전달된 객체에 바인딩된다.
function func() {
console.log(this.name);
}
var obj = { name: 'obj name' };
func.call(obj); // obj name
func.apply(obj); // obj name
(func.bind(obj))(); // obj name
PHP
복사
3.
객체의 메소드로 호출할 경우 호출한 객체에 바인딩된다.
var obj = {
name: 'obj name',
print: function p() { console.log(this.name); }
};
obj.print(); // obj name
PHP
복사
4.
그 외의 경우
•
strict mode : undefined 로 초기화된다.
•
일반 : 브라우저라면 window 객체에 바인딩 된다.