이번 글에서는 자바스크립트에서 헷갈리는 개념 중에 하나인 this 키워드에 대해서 알아보겠습니다.
const person = {
firstName: "John",
lastName : "Doe",
fullName : function() {
return this.firstName + " " + this.lastName;
}
};
console.log(person.fullName()); // John Doe
const arr = {
numbers : [1, 2, 3, 4, 5],
print: function(delay=1000) {
setTimeout(function() {
console.log(this.numbers.join(',')) // Uncaught TypeError: Cannot read properties of undefined (reading 'join')
console.log(this) // Window
}, delay)
}
}
arr.print()
const arr2 = {
numbers : [1, 2, 3, 4, 5],
print: function(delay=1000) {
setTimeout(() => {
console.log(this.numbers.join(',')) // 1,2,3,4,5
console.log(this) // {numbers: Array(5), print: ƒ}
}, delay)
}
}
arr2.print()
const arr3 = {
numbers : [1, 2, 3, 4, 5],
print: (delay=1000) => {
setTimeout(() => {
console.log(this.numbers.join(',')) // Uncaught TypeError: Cannot read properties of undefined (reading 'join')
console.log(this) // Window
}, delay)
}
}
arr3.print()
🍖 결론 - 메서드 안의 함수에서 this가 객체를 가리키려면?
객체 안의 메서드를 일반 함수로 만들고, 그 안에 화살표 함수를 만들어서 this를 사용합니다.
그러면 이 this가 해당 객체를 가리키기 때문에 혼동할일 없이 사용할 수 있습니다.
console.log(this); // Window
"use strict";
console.log(this); // Window
function 함수() {
return this;
}
console.log(함수()); // Window
'use strict';
function 함수() {
return this;
}
console.log(함수()); // undefined
<button onclick="this.style.color='red'">
클릭하면 빨간색으로 변경!
</button>
아래의 예시를 보면서 이해해 보겠습니다.
function show() {
console.log(this.height + ' cm');
}
const obj = {
height: 200,
show: show
}
obj.show() // 200 cm
다른 예시를 보겠습니다.
function show() {
console.log(this.height + ' cm');
}
const obj = {
height: 200,
show: show,
안쪽obj: {
height: 220,
show: show
}
}
obj.안쪽obj.show(); // 220 cm
obj.show(); // 200 cm
const student1 = {
fullName: function() {
return this.firstName + " " + this.lastName;
}
}
const student2 = {
firstName:"John",
lastName: "Doe",
}
student1.fullName.call(student2); // "John Doe"
const person = {
firstName:"John",
lastName: "Doe",
fullName: function () {
return this.firstName + " " + this.lastName;
}
}
//메서드에서 this => 해당 객체
console.log(person.fullName()); // 'John Doe'
const student = {
firstName:"Heung Min",
lastName: "Son",
}
let fullName = person.fullName.bind(student);
//함수 빌리기
console.log(fullName()); // 'Heung Min Son'
예시를 보겠습니다.
function person(age) {
this.age = age;
}
const bar = new person(17);
console.log(bar.age); // 17