๐ this ๋?
๋ฉ์๋์๊ฒ, ์์ ์ด ๊ด๋ฆฌํด์ผํ๋ ๊ฐ์ฒด๋ฅผ ์๋ ค์ฃผ๋ ๊ฒ
// foo1() ๋ฉ์๋๋ cat ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ฏ๋ก, ์ด๋ this๋ก cat์ ์ ๋ฌํ๋ค.
const cat = {
name: 'meow',
foo1: function(){
console.log(this.name);
}
};
this๊ฐ ํ์ํ ์ด์
๋ฉ์๋๋, ๊ฐ์ฒด ๋ด๋ถ์ ๋ฉค๋ฒ๋ณ์(property)๋ค์ ๋ค๋ฃจ๊ธฐ ์ํด ์กด์ฌํ๋ค. ( ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ด๋ฏ๋ก )
๊ทธ๋ฌ๋ ค๋ฉด, ์์ ์ด ์ํ ๊ฐ์ฒด์ ๋ํ ์ ๋ณด(this)๋ฅผ ์๊ณ ์์ด์ผ ํ๋ค.
this์์ด, ์์ ์ด ์ํ ๊ฐ์ฒด ์ ๋ณด ์ ๋ฌํ๊ธฐ
// this๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ์์ ์ด ์ํ ๊ฐ์ฒด๋ฅผ ์ง์ ์ ์ด์ค ๊ฒฝ์ฐ
let cat = {
name: 'meow',
foo1: function(){
console.log(cat.name);
},
}
// cat ๊ฐ์ฒด ๋ณต์ฌ
let cat2 = cat
// ๊ธฐ์กด cat ๊ฐ์ฒด ์ญ์
cat = null
// cat2 ๊ฐ์ฒด์ foo1() ๋ฉ์๋ ์คํ
cat2.foo1()
cat2์ ๋ฉ์๋๋, cat2 ๊ฐ์ฒด์ ์์๋ค์ ๋ค๋ฃจ๊ธฐ ์ํด ๋ง๋ค์ด์ ธ์ผ ํ๋ค.
ํ์ง๋ง cat2.foo1() ๋ฉ์๋๋
cat.foo1() ๋ฉ์๋๋ฅผ ๋ณต์ฌํ ๊ฒ์ด๋ฏ๋ก,
cat2๊ฐ ์๋, cat์ ์ ๊ทผํ๊ณ ์๋ค.
์ด๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋ฉ์๋์ ์ญํ ์ ์๋ฐฐ๋๋ฏ๋ก,
๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๋๋ผ๋, ๋ฉ์๋๊ฐ ๊ด๋ฆฌํ ๊ฐ์ฒด๋ฅผ ์ ํํ ์๋ ค์ค ๋ณ์๊ฐ ํ์ํด์ก๋ค.
๊ทธ ๋ณ์๋ฅผ ๋ง๋ค๊ณ , this๋ผ๊ณ ์ด๋ฆ ๋ถ์๋ค.
๐ JS์์์ this
[ Javascript์์ this๋, ๋ค๋ฅธ ์ธ์ด์ this์ ๋ค๋ฅด๋ค. ]
1. javascript ๋ฐํ์(์คํ)์, ๋ฉ์๋๊ฐ ์์นํ ๊ณณ์์ ๊ฒฐ์
( ๋ฉ์๋๊ฐ ์ ์ ๋ ๊ณณ๊ณผ๋ ์๊ด์๋ค )
2. ํจ์๋ฅผ ๊ฐ์ธ๋ ๊ฐ์ฒด๊ฐ ๋ณด์ด์ง ์์ผ๋ฉด, ์ ์ญ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ
- ๋ธ๋ผ์ฐ์ ๋ฐํ์ : window ๊ฐ์ฒด
- Node.js ๋ฐํ์ : global ๊ฐ์ฒด
( ์ต๊ทผ ์ ์ญ๊ฐ์ฒด์ ์ด๋ฆ์ด globalThis๋ก ๋ณํฉ๋์ด ๊ฐ๊ณ ์๋ค. )
// ํจ์์ ์์, this๋ฅผ ์ ํ์ง ์์
function getUser(){
return {
name: "John",
ref: alert(this.name)
}
}
// ํจ์ํธ์ถ๋จ => javascript ๋ฐํ์ => this๊ฐ ๊ฒฐ์ ๋จ
// getUser()๋ ํจ์๋ก ํธ์ถ๋์ผ๋ฏ๋ก, this๋ ์ ์ญ๊ฐ์ฒด๋ก ์ ํด์ง๋ค. ( window )
let user = getUser()
console.log(user.ref())
// window.name์ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก, undefined ์ถ๋ ฅ
๐ this์ ํ์ดํ ํจ์
[ ํ์ดํํจ์๋ ๊ณ ์ ํ this๊ฐ ์์ ]
ํ์ดํํจ์ ์์์ this๋ฅผ ์ฐธ์กฐํ๋ฉด, ํ๋ฒํ ์ธ๋ถ ํจ์์์ this๋ฅผ ๋น๋ ค์จ๋ค.
let user = {
firstName: "๋ณด๋ผ",
sayHi() {
// arrow() ํจ์ ๋ฐ์ sayHi์ this๋ฅผ ๋น๋ ค์จ๋ค
let arrow = () => alert(this.firstName);
arrow();
}
};
user.sayHi()
// ๋ณด๋ผ ์ถ๋ ฅ
๐ ๋ฐ์ธ๋ฉ์ด๋?
๊ธฐ์กด์ this๋ฅผ ๋ฌด์ํ๊ณ , ์ฌ์ฉ์๊ฐ ์ํ๋ ๊ฐ์ฒด๋ก this๋ฅผ ์ค์ ํ๋ ๊ฒ
const cat = {
name: 'meow',
foo1: function(){
// this : cat
console.log(this.name);
}
};
const dog = {
name: 'wak',
foo1: function(){
// this : cat
console.log(this.name);
}
};
// cat๊ฐ์ฒด์ foo1()๋ฉ์๋๊ฐ ๊ด๋ฆฌํด์ผํ ๊ฐ์ฒด๋ฅผ dog๋ก ๋ฐ๊ฟ์ ์คํํ๋ค.
cat.foo1.bind(dog)
/*
cat๊ฐ์ฒด์ foo1()๋ฉ์๋ ์คํ๊ฒฐ๊ณผ : wak
*/
๋ฐ์ธ๋ฉ์ด ํ์ํ ์ด์
setTimeout์ ๋ฐ์๋๋ฅผ ์ ๋ฌํ ๋์ฒ๋ผ,
๊ฐ์ฒด ๋ฉ์๋๋ฅผ ์ฝ๋ฐฑ์ผ๋ก ์ ๋ฌํ ๋,
this๊ฐ ์ฌ๋ผ์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์
๋ฐ์ํ