this
this란?
- 객체를 가르키는 참조 변수
this
는 동적으로 결정this
의 값은 함수가 어떻게 호출이 되는지, 어떤 방식으로 호출이 되는지에 따라 가르키는 대상이 다르다.
let x = this;
console.log(x); //window Object
note
window 객체란?
브라우저 환경의 전역공간을 의미
tip
어떤 객체의 메소드가 아닌 단독 호출되는 함수의 this는 전역공간을 참조
this 예제1
function Call() {
console.log(this.name); // JJamVa
}
var name = "JJamVa";
note
window 객체 내부 중 name이 있다.
var name
은 사실 name앞에 window의 객체가 있기 때문에 window.name = "JJamVa"가 되기 때문에
this.name은 "JJamVa"를 가르키는 것이다.
function Call() {
console.log(this.n); // undefined
}
var n = "JJamVa";
note
window 객체에 n이라는 속성은 없기 때문에 undefined가 출력
this 예제2
function Call() {
console.log(this.name);
}
let obj1 = {
name: "IronMan",
sayName: Call,
};
obj1.sayName(); //IronMan
note
obj1의 Call함수가 sayName의 속성값이다.
obj의 sayName을 호출하면 Call함수안에 this가 obj1의 name 속성을 지목하게 된다.
그래서 출력이 IronMan인 것을 확인할 수 있다.
function Call() {
console.log(this.name);
}
let obj1 = {
name: "IronMan",
sayName: Call(),
};
obj1.sayName; // ""
note
obj1안에 sayName이 Call()로 변경만 하였는데 출력 결과가 바뀌었다.
sayName이 Call일 경우에 obj1.sayName을 호출할 경우
호출한 후의 시점으로 객체 위치를 참조하여 this.name의 결과물이 반환
sayName이 Call()일 경우는 obj1.sayName 호출할 경우
Call함수의 기준으로 this.name의 참조된 값이 obj1의 sayName속성에 저장되기 때문에
window 객체의 name 값인 ""가 반환된 것이다.
this의 특징
- this는 함수가 실행되는 시점에서 참조해야할 값이 결정
function Call() {
console.log(this.name);
}
let obj1 = {
name: "IronMan",
sayName: Call,
};
let obj2 = {
name: "SuperMan",
sayName: obj1.sayName,
};
obj2.sayName(); //SuperMan
this 메소드
call()
- 사용할 값을 전달
- 함수에 Parameter가 있을 경우, Argument값도 전달 가능
var obj1 = {
movie: "Avatar",
print: function (str = "") {
console.log(this.movie + str);
},
};
var obj2 = {
movie: "Avengers",
};
obj1.print.call(obj1); // Avatar
obj1.print.call(obj2, " veryGood"); // Avengers veryGood
apply()
- 사용할 값을 전달
- Argument 값을를 단일한 배열로 전달한다는것이
call()
과의 차이점
var obj1 = {
movie: "Avatar",
print: function (str1, str2) {
console.log(this.movie + str1 + " & " + str2);
},
};
var obj2 = {
movie: "Avengers",
};
obj1.print.apply(obj2, [" Good", "Awesome"]); // Avengers Good & Awesome
bind()
- this가 고정된 함수를 반환
function Call() {
console.log(this.movie);
}
var obj1 = {
movie: "Avatar",
print: Call,
};
var obj2 = {
movie: "Avengers",
print: Call.bind(obj1),
};
obj1.print(); // Avatar
obj2.print(); // Avatar
중첩 함수의 this
일반 중첩 함수의 this
function a() {
console.log(this); // window object
function b() {
console.log(this); // window object
}
b();
}
a();
tip
객체를 생성하지 않은 일반 함수에서는 this가 의미 없다.
일반이던 중첩이던 this에는 전역 객체가 바인딩이 된다.
어떤 함수라도 일반 함수로 호출되면 전역 객체가 바인딩 되는 것을 기억