
์๋ฐ์คํฌ๋ฆฝํธ์์ โthisโ ๋ง์คํฐํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ์์ โthisโ ๋ง์คํฐํ๊ธฐ ๊ด๋ จ
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐฐ์ฐ๋ค ๋ณด๋ฉด, ์ข ์ข this๋ผ๋ ํค์๋๋ฅผ ๋ง์ฃผ์น๊ฒ ๋๋๋ฐ์. ์ธ๋ป ๋ณด๊ธฐ์๋ ๋จ์ํ ์๋จ์ด โthisโ์ ๋ป๊ณผ ๋น์ทํ๊ฒ ํ์ฌ์ ๋ฌธ๋งฅ์ด๋ ๋งฅ๋ฝ์ ๋ํ๋ด๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ํ์ง๋ง ๋ง์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ์๊ฐ๋ณด๋ค ๋ณต์กํ๋ค๋ ๊ฒ์ ๊นจ๋ซ๊ฒ ๋์ฃ . ๊ทธ๋ ๋ค๊ณ ๋๋ฌด ๊ฑฑ์ ํ ํ์๋ ์์ต๋๋ค. this ํค์๋๋ ๊ทธ ์๋ฆฌ๋ฅผ ํ ๋ฒ ์ ๋๋ก ์ดํดํ๋ค๋ฉด, ๋ค์ํ ์ํฉ์์๋ ์ฝ๊ฒ ๊ทธ ๋์์ ์์ธกํ๊ณ ํ์ฉํ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ๊ฐ ๋ฉ๋๋ค.

this
๋ ๋ง์น ํ ๋ง๋ฆฌ์ ์นด๋ฉ๋ ์จ๊ณผ๋ ๊ฐ์ต๋๋ค. ์นด๋ฉ๋ ์จ์ด ์ฃผ๋ณ ํ๊ฒฝ์ ๋ฐ๋ผ ์์ ๋ฐ๊พธ๋ฏ, this
๋ โํจ์๊ฐ ์ด๋์์ ํธ์ถ๋์๋์งโ, โ์ด๋ค ๋ฌธ๋งฅ์์ ์คํ๋๋์งโ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. ์ด ํน์ฑ ๋๋ฌธ์ ์ด๋ณด ๊ฐ๋ฐ์๋ฟ๋ง ์๋๋ผ, ๋ง์ ๊ฐ๋ฐ์์๊ฒ๋ ์ข
์ข
ํผ๋์ ์๊ฒจ์ฃผ๊ณค ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ์ this
๊ฐ ํจ์ ์์์๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ค๊ฐ๋, ๋ฉ์๋ ์์์๋ ํด๋น ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ , ์ฝ๋ฐฑ ํจ์ ์์์๋ ๋ ๋ค๋ฅธ ๊ฐ์ ๊ฐ๋ฆฌํต๋๋ค.
๊ทธ๋ ๋ค๋ฉด, ์ด๋ฌํ this
์ ํน์ฑ์ ๋ฌด์์ ์ํด ๋ง๋ค์ด์ง ๊ฒ์ผ๊น์? ์๋ฐ์คํฌ๋ฆฝํธ์์ this
๋ ๋ค์ํ ์ํฉ์์ ์ ์ฐํ๊ฒ ๋์ํ๋๋ก ๋ง๋ค์ด์ก์ต๋๋ค. this
์ ์ ์ฐ์ฑ์ ์ดํดํ๊ณ ์ ํ์ฉํ๋ค๋ฉด, ์ฝ๋๋ฅผ ๋์ฑ ์ง๊ด์ ์ด๊ณ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ด๋ฒ ๊ธ์์๋ ํจ์์ ํธ์ถ ๋ฐฉ์์ ๋ฐ๋ผ this
๊ฐ ์ด๋ป๊ฒ ๋ณํํ๋์ง ์ฒด๊ณ์ ์ผ๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ ์ญ ๊ณต๊ฐ์์์ ํธ์ถ๋ถํฐ, ์ผ๋ฐ ํจ์์ ๋ฉ์๋, ์์ฑ์ ํจ์, ์ฝ๋ฐฑ ํจ์, ๊ทธ๋ฆฌ๊ณ call
, apply
, bind
๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์์ ๊น์ง ๋ชจ๋ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค.
์ ์ญ ๊ณต๊ฐ์์์ ํธ์ถ
์๋ฐ์คํฌ๋ฆฝํธ์์ this
๋ ์ฝ๋๊ฐ ์คํ๋๋ ๋ฌธ๋งฅ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ฐ์, ๊ทธ์ค ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ฒฝ์ฐ๋ ์ ์ญ ๊ณต๊ฐ์์์ ํธ์ถ์
๋๋ค. ์ ์ญ ๊ณต๊ฐ์์๋ this๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ญ ๊ฐ์ฒด(Global Object)๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ this๊ฐ ์ ์ญ ๊ฐ์ฒด์ธ window ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ฉฐ, Node.js ํ๊ฒฝ์์๋ global ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
console.log(this);
// ๋ธ๋ผ์ฐ์ ํ๊ฒฝ : window ๊ฐ์ฒด ์ถ๋ ฅ
// Node.js ํ๊ฒฝ : global ๊ฐ์ฒด ์ถ๋ ฅ
์ผ๋ฐ ํจ์์์์ ํธ์ถ
์ผ๋ฐ ํจ์์์์ this
๋ ํจ์๊ฐ ํธ์ถ๋ ๋ฐฉ์์ ๋ฐ๋ผ ๊ฐ์ด ๋ฌ๋ผ์ง๋๋ค. ์ผ๋ฐ ํจ์์์์ ํธ์ถ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ฌ๋ก ์ค ํ๋๋ก, ๊ธฐ๋ณธ์ ์ผ๋ก๋ ์ ์ญ ๊ณต๊ฐ์์์ ํธ์ถ๊ณผ ๋์ผํ๊ฒ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
function regularFunction() {
console.log(this);
}
regularFunction();
// ๋ธ๋ผ์ฐ์ ํ๊ฒฝ: window ๊ฐ์ฒด ์ถ๋ ฅ
// Node.js ํ๊ฒฝ: global ๊ฐ์ฒด ์ถ๋ ฅ
์์ ์ฝ๋์์ ์ผ๋ฐ ํจ์์ธ regularFunction
์ ๊ฒฐ๋ก ์ ์ผ๋ก ์ ์ญ ๊ณต๊ฐ์์ ํธ์ถ๋์๊ธฐ ๋๋ฌธ์, thi
s๋ ๋ธ๋ผ์ฐ์ ์์๋ window ๊ฐ์ฒด๋ฅผ, Node.js์์๋ global ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
๋ฉ์๋์์์ ํธ์ถ
์๋ฐ์คํฌ๋ฆฝํธ์์ this
๋, ํจ์๊ฐ ํธ์ถ๋๋ ๋ฐฉ์์ ๋ฐ๋ผ ๊ฐ์ด ๋ฌ๋ผ์ง๋ฉฐ, ๋ฉ์๋ ๋ด๋ถ์์๋ ํธ์ถํ ๊ฐ์ฒด์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ํน์ง์ ๋ณด์
๋๋ค. ์ด๋ฒ์๋ ๋ฉ์๋ ๋ด๋ถ์์์ this
๊ฐ ์ด๋ค ๊ฐ์ ๊ฐ๋ฆฌํค๋์ง ์์ธํ๊ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ๋ฉ์๋๋?
๋ฉ์๋๋ ๊ฐ์ฒด์ ์์ฑ์ผ๋ก ์ ์๋ ํจ์์ ๋๋ค. ๋ค์ ๋งํด, ๊ฐ์ฒด ํ๋กํผํฐ์ ์ ์ฅ๋ ํจ์๋ผ๊ณ ํ ์ ์์ต๋๋ค. ๋ฉ์๋๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ํน์ ๋์์ ์ํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํ ์ ์์ต๋๋ค.
const user = {
name: โํ๊ธธ๋โ,
greet: function () {
console.log(`์๋
ํ์ธ์, ํ๊ธธ๋์
๋๋ค!`);
}
};
user.greet(); // ์๋
ํ์ธ์, ํ๊ธธ๋์
๋๋ค!
์์ ์ฝ๋์์ greet
๋ user
๊ฐ์ฒด์ ๋ฉ์๋๋ก, user.greet()
๋ก ๋ฉ์๋ค์ ํธ์ถํ๋ฉด, โ์๋
ํ์ธ์, ํ๊ธธ๋์
๋๋ค!โ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
2. ๋ฉ์๋ ๋ด๋ถ์์์ this
๊ทธ๋ ๋ค๋ฉด, ๋ฉ์๋ ๋ด๋ถ์ this
๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋จ๊น์? ์๋ ์์ ๋ฅผ ํตํด ํ์ธํด ๋ด
์๋ค.
const user = {
name: โํ๊ธธ๋โ,
greet: function () {
console.log(this);
}
};
user.greet();
// ์ถ๋ ฅ: { name: 'ํ๊ธธ๋', greet: [Function: greet] }
์์ ์ฝ๋์์ this
๋ greet
๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด์ธ user
๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋, ํด๋น ํธ์ถํ ๊ฐ์ฒด๋ฅผ this์ ์๋์ผ๋ก ๋ฐ์ธ๋ฉํฉ๋๋ค. ์ฆ, user.greet()
๋ greet
๋ฉ์๋๊ฐ user
๊ฐ์ฒด์ ์ํด ํธ์ถ๋์๊ธฐ ๋๋ฌธ์, this๋ user
๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์
๋๋ค.
์ด์ฒ๋ผ ๋ฉ์๋ ๋ด๋ถ์์ this
๋ ํธ์ถ๋ ๊ฐ์ฒด์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ฏ๋ก, ๋ฉ์๋ ํธ์ถ ๋ฐฉ์์ด this์ ๋์์ ๊ฒฐ์ ์ง๋ ํต์ฌ ์์๋ผ๊ณ ํ ์ ์์ต๋๋ค. ๊ทธ๋ผ ์ด๋ฒ์๋ ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ํตํด ์ง๊ธ๊น์ง ๋ฐฐ์ด ๋ด์ฉ์ ํ
์คํธํด ๋ณด๊ฒ ์ต๋๋ค.
const user = {
name: โํ๊ธธ๋โ,
greet: function () {
console.log(this);
}
};
const greetFunction = user.greet;
greetFunction();
์์ ์ฝ๋๋ฅผ ์คํํ์ ๋, ์ด๋ฒ์๋ this
๋ user
๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํฌ๊น์?

์๋๋๋ค. ์ค์ ๋ก ์์ ์ฝ๋๋ฅผ ์คํํ๋ฉด this
๋ ๋ ์ด์ user
๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค์ง ์์ต๋๋ค. ๋์ ์ ์ญ ๊ฐ์ฒด(window
๋๋ global
)๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋์ฃ . ๊ทธ ์ด์ ๋ this
๊ฐ ํฌํจ๋ greet
๋ฉ์๋๊ฐ user
๊ฐ์ฒด์ ์ํด ํธ์ถ๋ ๊ฒ์ด ์๋๋ผ, ์ด๋ฒ์๋ ์ ์ญ ๊ณต๊ฐ์์ greetFunction
์ ์ํด ํธ์ถ๋์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด์ฒ๋ผ ๋ฉ์๋๊ฐ ์์ ์ ํฌํจํ๊ณ ์๋ ๊ฐ์ฒด์ ์ํด ์ง์ ์ ์ผ๋ก ํธ์ถ๋์ง ์๊ณ , ๋
๋ฆฝ์ ์ผ๋ก ์คํ๋๋ ๊ฒฝ์ฐ, this
๋ ๋ค๋ฅธ ๊ฐ์ ์ฐธ์กฐํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ์ํฉ์์ this
๋ฅผ ์ํ๋ ๊ฐ์ ๊ณ ์ ์ํค๊ธฐ ์ํด์๋ call
, apply
, bind
์ ๊ฐ์ ๋ฉ์๋๋ค์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋๋ฐ์. ์ด ๋ฉ์๋๋ค์ ๋ํด์๋ ์กฐ๊ธ ๋์ค์ ๋ ์์ธํ๊ฒ ๋ฐฐ์๋ณด๊ฒ ์ต๋๋ค.
์์ฑ์ ํจ์์์์ ํธ์ถ
์ด์ this
๊ฐ ์์ฑ์ ํจ์์์ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์์ฑ์ ํจ์๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํน๋ณํ ํจ์ ์ ํ์ผ๋ก, new
๋ผ๋ ํค์๋์ ํจ๊ป ์ฌ์ฉ๋๋ฉฐ, ํธ์ถ ์ ๋ค์๊ณผ ๊ฐ์ ์ผ๋ค์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์๋ก์ด ๋น ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
new
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์๋์ผ๋ก ์๋ก์ด ๋น ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ์ด ๊ฐ์ฒด๋ ์ดํ ์ฐ๋ฆฌ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ฒ ๋ ๊ทธ๋ฆ๊ณผ๋ ๊ฐ์ต๋๋ค. this
๊ฐ ์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ค์ ํฉ๋๋ค. ์์ฑ์ ํจ์ ๋ด๋ถ์์this
๋ ์ฐ๋ฆฌ๊ฐ ๋ฐฉ๊ธ ๋ง๋ ๋น ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์์ฑ์ ํจ์ ๋ด๋ถ์์this
๋ฅผ ํตํด ๊ฐ์ฒด์ ์์ฑ์ ์ถ๊ฐํ๊ฑฐ๋ ์์ ํ ์ ์์ต๋๋ค.- ํจ์์ ์คํ์ด ๋๋ ์ดํ, ์๋์ผ๋ก ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ์์ฑ์ ํจ์๋ ์ฐ๋ฆฌ๊ฐ ๋ช
์์ ์ผ๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ์ง ์๋ ํ,
this
๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ์ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ๋ฐํํฉ๋๋ค. ๋ฐ๋ผ์ ์ถ๊ฐ์ ์ธ ๋ฐํ ์์ ์ ํ์ง ์์๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
1. ์์ฑ์ ํจ์๋?
์์ฑ์ ํจ์๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํน๋ณํ ํจ์๋ก, ์ผ๋ฐ์ ์ผ๋ก ์์ฑ์ ํจ์์ ์ด๋ฆ์ ์ฒซ ๊ธ์๋ฅผ ๋๋ฌธ์๋ก ์์ฑํ๋ฉฐ, new ํค์๋์ ํจ๊ป ํธ์ถ๋ฉ๋๋ค. ์์ฑ์ ํจ์๋ ์ ์ฌํ ๊ตฌ์กฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์์ฑํด์ผ ํ ๋ ์ฌ์ฉํ๋ฉด ์ ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ๋ฌ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ฌ์ฉ์์ ์ด๋ฆ, ๋์ด ๋ฑ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผ ํ๋ ๊ฒฝ์ฐ, ์์ฑ์ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ณต๋๋ ์์ ์ ์ค์ด๊ณ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
function User(name, age) {
this.name = name; // ์๋ก์ด ๊ฐ์ฒด์ name ํ๋กํผํฐ ์ค์
this.age = age; // ์๋ก์ด ๊ฐ์ฒด์ age ํ๋กํผํฐ ์ค์
}
const user1 = new User('ํ๊ธธ๋', 25);
const user2 = new User('๊น์ฒ ์', 30);
console.log(user1); // ์ถ๋ ฅ: User { name: 'ํ๊ธธ๋', age: 25 }
console.log(user2); // ์ถ๋ ฅ: User { name: โ๊น์ฒ ์โ, age: 30 }
์์ ์์ ์ฒ๋ผ, ์์ฑ์ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋น์ทํ ๊ตฌ์กฐ์ ๊ฐ์ฒด๋ฅผ ๋น ๋ฅด๊ณ ์ผ๊ด๋๊ฒ ์์ฑํ ์ ์์ต๋๋ค. ๋ํ ์์ฑ์ ํจ์ ๋ด๋ถ์ ๊ณตํต ๋ก์ง์ ์์ฑํ๋ฉด ๋ชจ๋ ๊ฐ์ฒด์์ ์ผ๊ด๋ ์ด๊ธฐ ์ค์ ์ ์ ์ฉํ ์ ์์ด ์ ์ง ๋ณด์์๋ ์ ๋ฆฌํฉ๋๋ค.
2. ์์ฑ์ ํจ์ ๋ด๋ถ์์์ this
์์ฑ์ ํจ์ ๋ด๋ถ์์ this
๋ ํน๋ณํ ์ญํ ์ ํฉ๋๋ค. new
ํค์๋์ ํจ๊ป ์์ฑ์ ํจ์๋ฅผ ํธ์ถํ๋ฉด, this
๋ ์๋์ผ๋ก ์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฒ ๋์ด, ์์ฑ์ ํจ์๊ฐ ๊ฐ์ฒด์ ์ด๊ธฐ ์ํ๋ฅผ ์ค์ ํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์์ ๋ฅผ ํตํด this
๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋ค์ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ ๋ณด๊ฒ ์ต๋๋ค.
function User(name, age) {
this.name = name; // ์๋ก์ด ๊ฐ์ฒด์ name ํ๋กํผํฐ ์ค์
this.age = age; // ์๋ก์ด ๊ฐ์ฒด์ age ํ๋กํผํฐ ์ค์
}
const user1 = new User('ํ๊ธธ๋', 25);
const user2 = new User('๊น์ฒ ์', 30);
console.log(user1.name); // ์ถ๋ ฅ: ํ๊ธธ๋
console.log(user2.age); // ์ถ๋ ฅ: 30
์์ ์ฝ๋์์ new User(โํ๊ธธ๋โ, 25)
๊ฐ ํธ์ถ๋๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ด ์งํ๋ฉ๋๋ค. ์ฐ์ ์๋ก์ด ๋น ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ , this
๋ ์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ๊ทธ ๋ค์ this.name
๊ณผ this.age
๋ฅผ ํตํด ์๋ก์ด ๊ฐ์ฒด์ ์์ฑ์ด ์ค์ ๋๋ฉฐ, ์์ฑ์ ํจ์๊ฐ ์๋ฃ๋ ์ดํ this
๊ฐ ์๋์ผ๋ก ๋ฐํ๋ฉ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก user1
๊ณผ user2
๋ ๊ฐ๊ฐ ํ๊ธธ๋๊ณผ ๊น์ฒ ์์ ์ ๋ณด๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ก ์์ฑ๋์ด, user1.name
์ ์ถ๋ ฅ๊ฐ์ โํ๊ธธ๋โ, user2.age
์ ์ถ๋ ฅ๊ฐ์ 30์ด ๋ฉ๋๋ค.
์ฝ๋ฐฑ ํจ์์์์ ํธ์ถ
์ด๋ฒ์๋ ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์์ this
๊ฐ ์ด๋ค ๊ฐ์ ๊ฐ์ง๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ฝ๋ฐฑ ํจ์๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋งค์ฐ ์์ฃผ ์ฌ์ฉ๋๋ฉฐ, this์ ๋์์ ์ดํดํ๋ ๋ฐ ์ค์ํ ๊ฐ๋
์
๋๋ค.
1. ์ฝ๋ฐฑ ํจ์๋?
์ฝ๋ฐฑ ํจ์๋ ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ์ ๋ฌ๋์ด ์คํ๋๋ ํจ์๋ฅผ ๋งํฉ๋๋ค. ์ฆ, ํน์ ์์ ์ด ์๋ฃ๋ ํ ์คํ๋๊ฑฐ๋, ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ํธ์ถ๋๋ ํจ์์ ๋๋ค. ๋ค์์ ์ฝ๋ฐฑ ํจ์์ ๊ฐ๋จํ ์์ ์ ๋๋ค.
function greet(callback) {
console.log("์๋
ํ์ธ์!");
callback();
}
function sayGoodbye() {
console.log("์๋
ํ ๊ฐ์ธ์!");
}
greet(sayGoodbye);
//
// ์๋
ํ์ธ์!
// ์๋
ํ ๊ฐ์ธ์!
์์ ์ฝ๋์์ sayGoodbye
๊ฐ ๋ฐ๋ก greet
ํจ์์ ์ ๋ฌ๋ ์ฝ๋ฐฑ ํจ์์
๋๋ค. greet
ํจ์ ๋ด๋ถ์์ callback()
์ด ํธ์ถ๋๋ฉด์, ์ ๋ฌ๋ ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋ฉ๋๋ค.
2. ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์์์ this
์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์ this
๋ํ, ์์ ์ ํฌํจํ๊ณ ์๋ ํจ์๊ฐ ์ด๋ป๊ฒ ํธ์ถ๋์๋์ง์ ๋ฐ๋ผ ๊ฐ์ด ๋ฌ๋ผ์ง๋๋ค. ํนํ ์ฝ๋ฐฑ ํจ์๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ฑฐ๋, ํธ์ถํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฑ ์ํฉ์ ๋ฐ๋ผ ๋์์ด ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํ๋๋ฐ์. ์๋์ ์์ ์ฝ๋๋ฅผ ํตํด ์กฐ๊ธ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค.
const user = {
name: 'ํ๊ธธ๋',
greet: function () {
console.log(`์๋
ํ์ธ์, ${this.name}์
๋๋ค.`);
}
};
function executeCallback(callback) {
callback();
}
executeCallback(user.greet);
//
// ์๋
ํ์ธ์, undefined์
๋๋ค.
์์ ์ฝ๋์์ user.greet
๋ ์๋ user
๊ฐ์ฒด์ ๋ฉ์๋์
๋๋ค. ํ์ง๋ง executeCallback
ํจ์์ ์ ๋ฌ๋ ์ดํ, user.greet
๋ ๋
๋ฆฝ์ ์ธ ํจ์๋ก ์ ์ญ ๊ณต๊ฐ์์ ํธ์ถ๋๊ณ ์๊ธฐ ๋๋ฌธ์, ๋ ์ด์ user
๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ์ง ์์ต๋๋ค. ๋์ , ์ผ๋ฐ ํจ์์ฒ๋ผ ๋์ํ๋ฉฐ this
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ญ ๊ฐ์ฒด(window
๋๋ global
)๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ฉ๋๋ค.

์ด์ฒ๋ผ ์ฝ๋ฐฑ ํจ์๊ฐ ๋
๋ฆฝ์ ์ผ๋ก ์คํ๋ ๊ฒฝ์ฐ์ this
๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฒ ๋ฉ๋๋ค. ์ฝ๋ฐฑ ํจ์์ this
๋ฅผ ๊ณ ์ ํ๋ ค๋ฉด bind
, call
, apply
์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋๋ฐ, ์ด์ด์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
this
๋ฅผ ๊ณ ์ ์ํค๋ ๋ฐฉ๋ฒ
์ฝ๋ฐฑ ํจ์์์ this
๊ฐ ์์์น ๋ชปํ ๊ฐ์ ์ฐธ์กฐํ๊ฒ ๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ์๋ฐ์คํฌ๋ฆฝํธ๋ this
๋ฅผ ๊ณ ์ ์ํค๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํ์ฉํ๋ฉด ์ฝ๋ฐฑ ํจ์๊ฐ ์๋ ์๋ํ๋ ๊ฐ์ฒด๋ฅผ ๊ฒ์ ์ฐธ์กฐํ๋๋ก ๋ง๋ค ์ ์์ต๋๋ค.
1. bind
๋ฉ์๋
bind ๋ฉ์๋๋ ํจ์์ this
๊ฐ์ ์๊ตฌ์ ์ผ๋ก ๊ณ ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์
๋๋ค. bind
๋ ์๋ก์ด ํจ์๋ฅผ ๋ฐํํ๋ฉฐ, ๋ฐํ๋ ํจ์๋ ํญ์ ํน์ ๊ฐ์ฒด๋ฅผ this๋ก ์ฌ์ฉํฉ๋๋ค. ์์ ์ฝ๋๋ฅผ ํตํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
const user = {
name: 'ํ๊ธธ๋',
greet: function () {
console.log(`์๋
ํ์ธ์, ${this.name}์
๋๋ค.`);
}
};
function executeCallback(callback) {
callback();
}
// this๋ฅผ ๊ณ ์
const boundGreet = user.greet.bind(user);
executeCallback(boundGreet);
//
// ์๋
ํ์ธ์, ํ๊ธธ๋์
๋๋ค.
์์ ์ฝ๋์์ user.greet.bind(user)
๋ผ๋ ์ฝ๋๋ฅผ ํตํด this๊ฐ ํญ์ user
๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋๋ก ๊ณ ์ ํด ๋ณด์์ต๋๋ค. ์ดํ this
๊ฐ executeCallback
ํจ์์์ ํธ์ถ๋๋๋ผ๋, this
๋ ์๋ํ ๋๋ก user
๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํด โ์๋
ํ์ธ์, ํ๊ธธ๋์
๋๋ค.โ๋ผ๋ ๋ฌธ์ฅ์ด ์๋ง๊ฒ ์ถ๋ ฅ๋ฉ๋๋ค.
2. call
, apply
๋ฉ์๋
bind
๋ฉ์๋ ์ธ์๋ this
๋ฅผ ์ํ๋ ๊ฐ์ผ๋ก ์ค์ ํ ์ ์๋ ๋ฉ์๋๋ก call
๊ณผ apply
๊ฐ ์์ต๋๋ค. ์ด ๋ ๋ฉ์๋๋ ํจ์๋ฅผ ์ฆ์ ์คํํ๋ฉด์, this
๋ฅผ ํน์ ๊ฐ์ฒด๋ก ์ค์ ํ ์ ์๋๋ก ๋์์ค๋๋ค. call
๊ณผ apply
์ ์ฐจ์ด๋ ์ธ์๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์ ์์ต๋๋ค. call
์ ์ธ์๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ ๋ฌํ๊ณ , apply
๋ ๋ฐฐ์ด ํํ๋ก ์ ๋ฌํ๋ค๋ ์ฐจ์ด์ ์ด ์๋๋ฐ์. ์์ ๋ฅผ ํตํด ์ดํด๋ด
์๋ค.
const user = {
name: 'ํ๊ธธ๋',
greet: function (greeting) {
console.log(`${greeting}, ${this.name}์
๋๋ค.`);
}
};
// call์ ์ฌ์ฉํ ์์
user.greet.call({ name: '๊น์ฒ ์' }, '์๋
ํ์ธ์');
// ์ถ๋ ฅ: ์๋
ํ์ธ์, ๊น์ฒ ์์
๋๋ค.
// apply๋ฅผ ์ฌ์ฉํ ์์
user.greet.apply({ name: '์ด์ํฌ' }, ['๋ฐ๊ฐ์ต๋๋ค']);
// ์ถ๋ ฅ: ๋ฐ๊ฐ์ต๋๋ค, ์ด์ํฌ์
๋๋ค.
์์ ์ฝ๋์์๋ call
๊ณผ apply
๋ฅผ ์ฌ์ฉํด this
๋ฅผ ๊ฐ๊ฐ { name: โ๊น์ฒ ์โ }
์ { name: โ์ด์ํฌโ }
๋ก ์ค์ ์ ํด์ฃผ์๋๋ฐ์, ์ด์ฒ๋ผ call
๋ฉ์๋๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก this
๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ์ค์ ํ๊ณ , ๋๋จธ์ง ์ธ์๋ ํจ์์ ์ ๋ฌํ๋ ๋ฐ๋ฉด, apply
๋ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋์ํ์ง๋ง, ์ถ๊ฐ ์ธ์๋ฅผ ๋ฐฐ์ด ํํ๋ก ์ ๋ฌํ๋ค๋ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
call
, apply
, bind ๋ฉ์๋ ๋น๊ต

์ด์ฒ๋ผ call
๊ณผ apply
๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์์ this๋ฅผ ์ ์ฐํ๊ฒ ์กฐ์ํ ์ ์์ด, ํน์ ์ํฉ์์ ์ ์ฉํ๊ฒ ํ์ฉํ ์ ์์ต๋๋ค.
๋ง์น๋ฉฐ
์๋ฐ์คํฌ๋ฆฝํธ์์ this๋ ๋ง์น ํ ๋ง๋ฆฌ์ ์นด๋ฉ๋ ์จ์ฒ๋ผ ์ํฉ์ ๋ฐ๋ผ ์ฐธ์กฐ ๋์์ ๋ฐ๊พธ๋ ์ ์ฐํ ๋๊ตฌ์ ๋๋ค. ์ด๋ฒ ๊ธ์์ ์ดํด๋ณธ ๊ฒ์ฒ๋ผ, this๋ ํธ์ถ ๋ฐฉ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๋์์ ๊ฐ๋ฆฌํค๋ฉฐ, ์ด๋ฅผ ์ดํดํ๊ณ ํ์ฉํ๋ ๊ฒ์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ ๋ค๋ฃจ๋ ์ฒซ๊ฑธ์์ ๋๋ค. this๋ฅผ ๋ฅ์ํ๊ฒ ๋ค๋ฃจ๋ ๊ฒ์ ๋จ์ํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋์ด, ๋์ฑ ์ง๊ด์ ์ด๊ณ ์ ์ง ๋ณด์ํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ๋ง๋๋ ๋ฐ ํต์ฌ์ ์ธ ์ญํ ์ ํฉ๋๋ค. ์ด๋ฒ ๊ธ์ ํตํด ๋ค์ํ ํธ์ถ ๋ฐฉ์์์ this๋ฅผ ๋ฅ์ํ๊ฒ ๋ค๋ฃฐ ์ ์๋ ๊ฐ๋ฐ์๊ฐ ๋ ์ ์๊ธธ ๋ฐ๋๋๋ค.
์ฐธ๊ณ

