this는 자신이 속한 객체 또는 자신이 생성할 인스턴스를 가리키는 자기 참조 변수다. this를 통해 자신이 속한 객체 또는 자신이 생성할 인스턴스의 프로퍼티나 메서드를 참조할 수 있다.
this는 함수가 호출되는 방식에 의해 동적으로 결정된다.
function foo() {
console.log(this); // window
function bar() {
console.log(this); // window
}
bar();
}
foo();
function foo() {
'use strict';
console.log(this); // undefined
function bar() {
console.log(this); // undefined
}
bar();
}
foo();
var value = 1;
const obj = {
value: 100,
foo() {
console.log(this); // {value: 100, foo: f}
// 콜백 함수
setTimeout(function () {
console.log(this); // window
console.log(this.value); // 1
}, 100);
}
};
obj.foo();
-> 콜백 함수의 this에 전역 객체가 아닌 상위 스코프의 this를 가리키도록 하는 방법
var value = 1;
const obj = {
value: 100,
foo() {
// this 바인딩을 변수 that에 할당
const that = this;
// this 대신 that 참조
setTimeout(function () {
console.log(that.value); // 100
}, 100);
}
};
obj.foo();
var value = 1;
const obj = {
value: 100,
foo() {
// 콜백 함수에 this 바인딩
setTimeout(function () {
console.log(this.value); // 100
}.bind(this), 100);
}
};
obj.foo();
var value = 1;
const obj = {
value: 100,
foo() {
// 화살표 함수
setTimeout(() => console.log(this.value), 100); // 100
}
};
obj.foo();
const person = {
name: 'Lee',
getName() {
return this.name;
}
};
// getName을 호출한 person 객체에 바인딩
console.log(person.getName()); // Lee
function Person(name) {
this.name = name;
}
Person.prototype.getName = function () {
return this.name;
};
const me = new Person('Lee');
// getName 메서드를 호출한 me 객체에 바인딩
console.log(me.getName()); // Lee
Person.prototype.name = 'Kim';
// getName 메서드를 호출한 Person.prototype 객체에 바인딩
console.log(Person.prototype.getName()); // Kim
// 생성자 함수
function Circle(radius) {
this.radius = radius;
this.getDiameter = function () {
return 2 * this.radius;
};
}
const circle = new Circle(5);
console.log(circle.getDiameter()); // 10
function getThisBinding() {
console.log(arguments);
return this;
}
// this로 사용할 객체
const thisArg = { a: 1 }
console.log(getThisBinding.apply(thisArg, [1, 2, 3]));
console.log(getThisBinding.call(thisArg, 1, 2, 3));
function getThisBinding() {
return this;
}
// this로 사용할 객체
const thisArg = { a: 1 };
// 함수를 새롭게 생성해 반환
console.log(getThisBinding.bind(thisArg)); // getThisBinding
// 명시적으로 함수 호출
console.log(getThisBinding.bind(thisArg)()); // {a: 1}
함수 호출 방식 | this 바인딩 |
---|---|
일반 함수 호출 | 전역 객체 |
메서드 호출 | 메서드를 호출한 객체 |
생성자 함수 호출 | 생성자 함수가 생성할 인스턴스 |
Function.prototype.apply/call/bind 메서드에 의한 간접 호출 | Function.prototype.apply/call/bind 메서드에 첫 번째 인수로 전달한 객체 |
출처 : 모던 자바스크립트 Deep Dive