๐ฎ this: "๋๊ฐ ๋๋ฅผ ๋ถ๋ฅธ ๊ฑฐ์ผ?"
์ ์ธ์ด ์๋, ํธ์ถ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ this๋ฅผ ์์๋ณด์๐จ
๊ทธ๋ฅ this๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ์๋ global object๋ฅผ ๊ฐ๋ฅดํจ๋ค.
console.log(this); // window
// strict mode => window
ํจ์ ์ this๋ ํจ์์ ์ฃผ์ธ์ธ window๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ ๋๋ค.
function a() {
return this;
}
console.log(a()); // window
/* strict mode => undefined
(ํจ์ ๋ด this์ ๋ํดํธ ๋ฐ์ธ๋ฉ์ด ์๊ธฐ ๋๋ฌธ) */
๋ฉ์๋ ํธ์ถ ์ this๋ ๋ฉ์๋ ๋ด๋ถ ์ฝ๋์์
์ฌ์ฉ๋ ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด๋ก ๋ฐ์ธ๋ฉ ๋๋ค.
โท ์์ 1
const objList = {
b: function () {
return this;
}
}
console.log(objList.b()); // objList
โท ์์ 2
const user = {
firstName: "TATA",
lastName: "V",
fullName: function () {
return this.firstName + "-" + this.lastName;
},
};
console.log(user.fullName()); // TATA-V
์ด๋ฒคํธ ํธ๋ค๋ฌ์์ this๋ ์ด๋ฒคํธ ํ๊ฒ์ธ HTML ์์๋ฅผ ๊ฐ๋ฅดํจ๋ค.
const $btn = document.querySelector("#btn")
$btn.addEventListener("click", function () {
console.log(this); // #btn
})
ํด๋์ค ๋ด์์ this๋ ํด๋น ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฅดํจ๋ค.
class User {
constructor(name) {
this.name = name;
}
}
var user1 = new User("TATA");
var user2 = new User("CHIMMY");
console.log(user1.name); // TATA
console.log(user2.name); // CHIMMY
bind, call, apply๊ณผ ๊ฐ์ ๋ช
์์ ๋ฐ์ธ๋ฉ์
์ฌ์ฉํ์ ๋์๋ ์ธ์๋ก ์ ๋ฌ๋ ๊ฐ์ฒด๋ก ๋ฐ์ธ๋ฉ๋๋ค.
function user() {
return this.name;
}
const objList = { name: "TATA" };
console.log(user.bind(objList)()); // TATA
console.log(user.call(objList)); // TATA
console.log(user.apply(objList)); // TATA
bind๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์๋ฅผ ์คํํ์ง ์๊ณ , ์๋ก์ด ํจ์๋ฅผ ๋ฐํํ๋ค.
์ฒซ ๋ฒ์งธ ์ธ์ ๊ฐ์ ํจ์ ๋ด๋ถ์์ ์ฌ์ฉ๋๋ this์ ๋ฐ์ธ๋ฉ๋๊ณ ,
๋ ๋ฒ์งธ ์ธ์ ๊ฐ๋ถํฐ๋ ์์ ์ ํธ์ถํ ํจ์์ ์ธ์๋ก ์ฌ์ฉํ๋ค.
function data(a, b, c) {
console.log(this.name);
console.log(this.squad);
console.log(a + b + c);
}
const user = {
name: "TATA",
squad: "BT21",
};
// ๋ฐํ๋ ์๋ก์ด ํจ์๋ฅผ ์คํํด์ผ ์๋ณธ ํจ์๊ฐ ์คํ๋๋ค.
data.bind(user, 1, 2, 3)();
// TATA
// BT21
// 6
๊ทธ๋์ ์ฒซ ๋ฒ์งธ ์ธ์์ null์ ๋ฃ์ด ํจ์ ์์ฒด๋ฅผ ๋ณต์ฌํ ์ ์๋ค.
function data(a, b, c) {
console.log("์ด๊ฒ์ด ๋ฐ๋ก");
console.log("bind");
console.log(a + b + c);
}
data.bind(null, 1, 2, 3)();
// ์ด๊ฒ์ด ๋ฐ๋ก
// bind
// 6
call์ ์ฌ์ฉํ๋ฉด ํจ์๋ฅผ ์คํํ๊ณ ,
์ฒซ ๋ฒ์งธ ์ธ์ ๊ฐ์ ํจ์ ๋ด๋ถ์์ ์ฌ์ฉ๋๋ this์ ๋ฐ์ธ๋ฉ๋๊ณ ,
๋ ๋ฒ์งธ ์ธ์ ๊ฐ๋ถํฐ๋ ์์ ์ ํธ์ถํ ํจ์์ ์ธ์๋ก ์ฌ์ฉํ๋ค.
function data(a, b, c) {
console.log(this.name);
console.log(this.squad);
console.log(a + b + c);
}
const user = {
name: "TATA",
squad: "BT21",
};
data.call(user, 1, 2, 3);
// TATA
// BT21
// 6
apply๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์๋ฅผ ์คํํ๊ณ ,
์ฒซ ๋ฒ์งธ ์ธ์ ๊ฐ์ ํจ์ ๋ด๋ถ์์ ์ฌ์ฉ๋๋ this์ ๋ฐ์ธ๋ฉ๋๊ณ ,
๋ ๋ฒ์งธ ์ธ์ ๊ฐ์ธ ๋ฐฐ์ด์ ์์ ์ ํธ์ถํ ํจ์์ ์ธ์๋ก ์ฌ์ฉํ๋ค.
function data(a, b, c) {
console.log(this.name);
console.log(this.squad);
console.log(a + b + c);
}
const user = {
name: "TATA",
squad: "BT21",
};
const arrNum = [1, 2, 3];
data.apply(user, arrNum);
// TATA
// BT21
// 6
// But, ์์ฆ์ apply๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ์คํ๋ ๋์ call์ ์ฌ์ฉํ๋ค.
data.call(user, ...arrNum);
// TATA
// BT21
// 6
ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ๋ถ์ this๋ฅผ ๊ฐ์ ธ์จ๋ค.
โท setTimeout ์ผ๋ฐ ํจ์
const user = {
firstName: "TATA",
lastName: "V",
fullName: function () {
setTimeout(function () {
console.log(this); // window
console.log(this.firstName + "-" + this.lastName);
}, 3000);
},
};
user.fullName(); // undefined
โท setTimeout ํ์ดํ ํจ์
const user = {
firstName: "TATA",
lastName: "V",
fullName: function () {
setTimeout(() => {
console.log(this.firstName + "-" + this.lastName);
}, 3000);
},
};
user.fullName(); // TATA-V