ํจ์์ ์์์ ํ๋ผ๋ฏธํฐ - this #1
์์์ ํ๋ผ๋ฏธํฐ์ธ this์ ๋ํด์ ์์๋ด ๋๋ค.
Jul 25, 2021
ํจ์์ ์์์ ํ๋ผ๋ฏธํฐ๋ 4ํธ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
๋ค์ด๊ฐ๋ฉฐ
์ง๋ ๊ธ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์์์ ์์์ ์ธ ํ๋ผ๋ฏธํฐ์ธ arguments์ ๋ํด์ ์์๋ดค๋๋ฐ์
์ด๋ฒ ํฌ์คํ ์์๋ this์ ๋ํด์ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค.
this
ํจ์๊ฐ ํธ์ถ๋๋ฉด ์์์ ์ธ ํ๋ผ๋ฏธํฐ์ธ arguments์ธ์ this๊ฐ ์ ๋ฌ๋ฉ๋๋ค.
์์ 1
function myThis() {
console.log(this);
}
myThis();
์์ 2
const obj = {
value: 10,
myThis: function () {
return this;
},
};
console.log(obj.myThis() === obj);
์์ 1๊ณผ ์์ 2์์ ์ฝ์์ ์ฐํ๋ ๊ฐ์ด ๋ฌด์์ผ๊น์?
jsfiddle์์ ํ์ธํด์ฃผ์ธ์this์ ๊ฐ์ ๊ฒฐ์ ํ๋ ๊ธฐ์ค์ ๋ฌด์์ผ๊น์?
ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ this์ ๊ฐ
ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์๋ ํฌ๊ฒ 4๊ฐ์ง ๋ฐฉ์์ด ์์ต๋๋ค.
- ํจ์๋ก์ ํธ์ถ(As a function): myThis() ์ฒ๋ผ ํจ์๋ฅผ ์ง์ ํธ์ถํ๋ ๋ฐฉ์
- ๋ฉ์๋๋ก์ ํธ์ถ(As a method): obj.myThis() ์ฒ๋ผ ํธ์ถ์ ๊ฐ์ฒด์ ์ฐ๊ฒฐํ์ฌ ํธ์ถ
- ์์ฑ์๋ก์ ํธ์ถ(As a constructor): new MyThis() ์ฒ๋ผ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ํธ์ถ
- call ๋ฐ apply๋ฅผ ํตํด์ ํธ์ถ(Via this functionโs apply or call method): Function ๊ฐ์ฒด์ call, apply ๋ฉ์๋๋ฅผ ํตํด์ ํธ์ถ
ํ๋ํ๋ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํจ์๋ก์ ํธ์ถ(As a function)
ํจ์๋ก์ ํธ์ถํ๋ค๋ ๊ฒ์ ๊ทธ๋ฅ ์ฐ๋ฆฌ๊ฐ ํ์์ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋๋ค.
ํจ์๋ก์ ํจ์๋ฅผ ํธ์ถํ๋ฉด this์ ๊ฐ์ ๋น ์๊ฒฉ ๋ชจ๋, ์๊ฒฉ ๋ชจ๋์ ๋ฐ๋ผ์ 2๊ฐ์ง๊ฐ ๋ ์ ์์ต๋๋ค.
- ๋น ์๊ฒฉ ๋ชจ๋
- ์๊ฒฉ ๋ชจ๋ (Strict mode)
๋น ์๊ฒฉ ๋ชจ๋
function sayHi() {
console.log(this === window); // true
}
sayHi();
let sayHi = function () {
console.log(this === window); // true
};
sayHi();
๋น ์๊ฒฉ ๋ชจ๋์์๋ ์ ์์ ์ฒ๋ผ ๋ธ๋ผ์ฐ์ ์ ์ ์ญ๊ฐ์ฒด์ธ window๋ก ์ถ๋ ฅ๋ฉ๋๋ค.
์๊ฒฉ ๋ชจ๋
'use strict';
function sayHi() {
console.log(this === undefined); // true
}
sayHi();
let sayHi = function () {
console.log(this === undefined); // true
};
sayHi();
ํ์ง๋ง โuse strictโ๋ฅผ ์ฌ์ฉํ ์๊ฒฉ ๋ชจ๋์์๋ undefined๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
๋ฉ์๋๋ก์ ํธ์ถ
์์ 2์ฒ๋ผ ํจ์๊ฐ ๊ฐ์ฒด์ ์์ฑ(property)์ ํ ๋น๋๊ณ ํด๋น ์์ฑ์ ์ฌ์ฉํด์ ํจ์๋ฅผ ํธ์ถํ๋ฉด ํจ์๊ฐ ํด๋น ๊ฐ์ฒด์ ๋ฉ์๋๋ก ํธ์ถ๋ฉ๋๋ค.
๋ฉ์๋๋ก์ ํธ์ถ์์ ์ค์ํ ์ ์
๊ฐ์ฒด์ ๋ฉ์๋๋ก ํจ์๋ฅผ ํธ์ถํ๋ฉด ํด๋น ๊ฐ์ฒด๋ ํจ์ ์ปจํ ์คํธ๊ฐ ๋๊ณ this ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ํจ์ ๋ด์์ ์ฌ์ฉํ ์ ์๋ค
๋ผ๋ ๊ฒ์ ๋๋ค. ์๋ ์ฝ๋๋ฅผ ํตํด์ ๋ฌด์จ ๋ป์ธ์ง ์์๋ณผ๊น์?
// ํจ์ ์ปจํ
์คํธ๋ฅผ ํ์ธํ๊ธฐ ์ํ ํจ์
function whatsMyContext() {
return this;
}
// 0. ํจ์๋ก์ ํธ์ถ
console.log(whatsMyContext() === window); // ?
// 1. whatsMyContext ํจ์๋ฅผ ์ฐธ์กฐ
const getMythis = whatsMyContext;
console.log(getMythis() === window); // ?
// 2. ๊ฐ์ฒด์ ๋ฉ์๋๋ก ์ฐธ์กฐํด์ ํธ์ถ
const obj = {
getMyThis: whatsMyContext,
};
console.log(obj.getMyThis() === obj); // ?
whatsMyContext๋ ํจ์ ์ปจํ ์คํธ๋ฅผ ํ์ธํ๊ธฐ ์ํด ๋จ์ํ this๋ง์ ๋ฆฌํดํฉ๋๋ค.
0๋ฒ์ ๊ฒฐ๊ณผ
0๋ฒ์ ๊ฒฝ์ฐ์๋ ๋น ์๊ฒฉ ๋ชจ๋์์ ํจ์๋ฅผํธ์ถ ํ์ผ๋ฏ๋ก ์ ์ญ ๊ฐ์ฒด์ธ window๊ฐ ์ถ๋ ฅ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค๋ณด๋ฉด true์ ๋๋ค.
1๋ฒ์ ๊ฒฐ๊ณผ
1๋ฒ์ ๊ฒฝ์ฐ๋ ๋จ์ํ whatsMyContext ํจ์๋ฅผ ์ฐธ์กฐํ๋ ๋ณ์์ ๋๋ค. ๊ฒฐ๊ณผ๋ true์ ๋๋ค.
2๋ฒ์ ๊ฒฐ๊ณผ
2๋ฒ์ ๊ฒฝ์ฐ๋ obj๋ผ๋ ๊ฐ์ฒด์ getMyThis๋ผ๋ ์์ฑ์ ๊ฐ์ผ๋ก whatsMyContext ํจ์๋ฅผ ์ฐธ์กฐํ์์ต๋๋ค.
์ด์ ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ๋ฉ์๋๋ก์ ํจ์๋ฅผ ํธ์ถ ํ๋ค๊ณ ํฉ๋๋ค.
์ฌ๊ธฐ์ ์ฃผ์ํด์ผ ํ ์ ์ obj ๊ฐ์ฒด์ ๋ฉ์๋๋ getMyThis๋ผ๊ณ ํ๋ค๋ ๊ฒ์ ๋๋ค. whatsMyContext๊ฐ ๋ฉ์๋๊ฐ ๋ ๊ฒ์ด ์๋๋๋ค.
๊ทธ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ดํด๋ณด๋ฉด true ์ ๋๋ค.
true์ธ ์ด์ ๋ ์์์ ์ค๋ช ํ ์ค์ํ ์ ์ ์ ํํ ์ผ์นํฉ๋๋ค.
๊ฐ์ฒด์ ๋ฉ์๋๋ก ํจ์๋ฅผ ํธ์ถํ๋ฉด ํด๋น ๊ฐ์ฒด๋ ํจ์ ์ปจํ ์คํธ๊ฐ ๋๊ณ this ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ํจ์๋ด์์ ์ฌ์ฉ ํ ์ ์๋ค
ํด๋น ๊ฐ์ฒด obj๊ฐ whatsMyContext์ ํจ์ ์ปจํ ์คํธ๊ฐ ๋์์ต๋๋ค.
๋ค์ ํ๋ฒ ์ฝ๋๋ฅผ ํตํด์ ํ์ธ ํด๋ณด๊ฒ ์ต๋๋ค.
// 3. 2๋ฒ๊ณผ ๋์ผํ์ง๋ง ์๋ก์ด obj2๋ผ๋ ๊ฐ์ฒด์ ๋งค์๋๋ก ํธ์ถ
const obj2 = {
getMyThis: whatsMyContext,
};
console.log(obj2.getMyThis() === obj); // false
console.log(obj2.getMyThis() === obj2); // true
obj, obj2์์ ๋ฉ์๋๋ก์ ํจ์๋ฅผ ํธ์ถํ์ฌ ๊ฐ๊ฐ ๋ค๋ฅธ ํจ์ ์ปจํ ์คํธ๊ฐ ํ์ฑ๋์์ต๋๋ค.
์ด๋ ๊ฒ ๋ฉ์๋๋ก์ ํจ์ ํธ์ถ์ ํตํด์ ๋ฉ์๋์ ์์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์๊ณ , ๊ฐ๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ํด ์ ํํ ๋์ผํ ์ฒ๋ฆฌ๋ฅผ ์ํํ๊ธฐ ์ํ ํจ์์ ๋ณต์ฌ๋ณธ์ ๋ฐ๋ณต์ ์ผ๋ก ๋ง๋ค ํ์๊ฐ ์์ต๋๋ค. ์ด๋ฅผ ํตํด์ ๊ฐ์ฒด์งํฅ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
์ ์์ ๋ค์ jsfiddle์์ ํ์ธํด์ฃผ์ธ์
๋ง์น๋ฉฐ
์์์ ์ธ ํ๋ผ๋ฏธํฐ this์ ๊ฐ์ ํจ์๊ฐ ํธ์ถ๋๋ ๋ฐฉ์์ผ๋ก ๊ฒฐ์ ๋๋๋ฐ ์ด๋ฒ ํฌ์คํ ์์๋
- ํจ์๋ก์ ํธ์ถ
- ๋ฉ์๋๋ก์ ํธ์ถ
์ ๋ํด ์์๋ดค์ต๋๋ค.
๋ค์ ํฌ์คํ ์์๋ ์์ฑ์๋ก์ ํธ์ถ, call ๋ฐ apply๋ฅผ ํตํ ํธ์ถ์ ์์๋ณด๊ฒ ์ต๋๋ค.
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.