this ๐ฆ
Javascript์์์ this์ ๋ํด ์์๋ณด๊ธฐ ์ ์, ๊ทธ๋ฅ 'this(์ด๊ฒ)'๋ผ๋ ๋ง์ ์ธ์ ์ฌ์ฉํ๋์ง ๋จผ์ ์๊ฐํด๋ณด์. ์ด๊ฑฐ์ข ๋จน์ด๋ด! ์ด๊ฑฐ ์ด๋? ์ด๊ฑฐ ๋ญ์ผ?.. ์ด๋ฐ ์์ผ๋ก '์ด๊ฒ(this)' ์ด๋ผ๋ ๋ง์ ์์์ ์ง์นญํ๊ธฐ๋, ๋ฌผ๊ฑด์ ์ง์นญํ๊ธฐ๋ ํ๋ค. ๋ค์ ๋งํด ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋์์ ์ง์นญํ๋ฉฐ ์ฐ์ผ ์ ์๋ ๋ง์ด๋ค.
Javascrpt์์๋ this๋ ์ํฉ์ ๋ฐ๋ผ ์ง์นญํ๋ ๋์์ด ๋ฐ๋๋ค. ๋ค๋ง ๊ทธ ์ํฉ์ด๋ผ๋ ๊ฒ 'ํจ์๊ฐ ํธ์ถ๋๋ ์ํฉ'์ผ ๋ฟ์ด๋ค. Javascript์ this๋ ์ผ๋จ ๊ธฐ๋ณธ์ ์ผ๋ก ํจ์๊ฐ ํธ์ถ๋ ๋ (=์คํ ์ปจํ ์คํธ ์์ฑ์) ๊ฒฐ์ ๋๋ฉฐ, ๋ณดํต ์์ ์ ํธ์ถํ ์ฃผ์ฒด์ ์ ๋ณด๊ฐ ๋ด๊ธฐ๊ฒ ๋๋ค.
ํจ์ ์คํ ๋ฐฉ๋ฒ
๊ทธ๋ผ ๋จผ์ 'ํจ์๊ฐ ํธ์ถ๋๋ ์ํฉ'์๋ ์ด๋ค ์ํฉ๋ค์ด ์๊ธธ๋ ์ง์นญ ๋์์ด ๋ฌ๋ผ์ง๋ค๋ ๊ฒ์ธ์ง ๋จผ์ ์ดํด๋ณด์.
1. ์ ์ญ ๊ณต๊ฐ์์์ this
2. ํจ์๋ก์ ํธ์ถ
3. ๋ฉ์๋๋ก์ ํธ์ถ
4. new ๋ฅผ ์ด์ฉํ ์์ฑ์ ํธ์ถ
5. call/apply๋ฅผ ํตํ ํธ์ถ
1. ์ ์ญ ๊ณต๊ฐ์์์ this
์๋ฐํ ๋งํ๋ฉด ํจ์ ์คํ ๋ฐฉ๋ฒ์ ์๋์ง๋ง, ์ ์ญ์์ this๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค. ์ ์ญ ๊ณต๊ฐ์์์ this๋ '์ ์ญ ๊ฐ์ฒด'์ด๋ค. ์ ์ญ ๊ฐ์ฒด๋ ๋ธ๋ผ์ฐ์ ์์๋ window, Node.js์์๋ global์ด ๋๋ค.
console.log(this === window)
// true (๋ธ๋ผ์ฐ์ ํ๊ฒฝ)
console.log(this === global)
// true (Node.js ํ๊ฒฝ)
ํ ๊ฐ์ง ๋ ํฅ๋ฏธ๋ก์ด ์ฌ์ค์ ์ ์ญ ๋ณ์๋ฅผ ์ ์ธํ๋ฉด, Javascript ์์ง์ ์ด๋ฅผ ์ ์ญ ๊ฐ์ฒด์ ์์ฑ์ผ๋ก ํ ๋นํ๋ค๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์๋์ฒ๋ผ var ๋์ window ์์ฑ์ผ๋ก ์ง์ ํ ๋น์ ํ ์๋ ์๋ค.
var a = 10;
windeow.a = 10;
2. ํจ์๋ก์ ํธ์ถ
ํจ์๋ ๊ทธ ์์ฒด๋ก, ํผ์์ ๋ ๋ฆฝ์ ์ธ ๊ธฐ๋ฅ์ ์ํํ๋ค. ์ด๋๊ฐ์ ์ข ์๋์ง ์๊ธฐ ๋๋ฌธ์, ๋ฐ๋ก ์๋์ ์๊ฐํ ๋ฉ์๋์๋ ๋ฌ๋ฆฌ ํจ์๋ ํธ์ถํ ์ฃผ์ฒด ๋ํ ์๋ค. ์์์ this๋ ์์ ์ ํธ์ถํ ์ฃผ์ฒด์ ์ ๋ณด๋ฅผ ๋ด๋๋ค๋ ์ด์ผ๊ธฐ๋ฅผ ํ์๋๋ฐ, ์ด๋ฅผ ๋ฐํ์ผ๋ก ์๊ฐํด๋ณด๋ฉด 'ํจ์ ⇒ ํธ์ถ์ฃผ์ฒด ์์ ⇒ this๊ฐ ๋ด์์ ๋ณด ์์' ์ด๋ผ๋ ๊ฒฐ๋ก ์ด ๋์จ๋ค. ์ด๋ ๊ฒ ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํ๋ ๊ฒฝ์ฐ, this๋ ์ ์ญ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.
3. ๋ฉ์๋๋ก์ ํธ์ถ
๋ฉ์๋๋ ์์ ์ ํธ์ถํ ๋์์ ์ข ์๋์ด ์๋ค. ํธ์ถํ ๋์์ ์ฝ๊ฒ๋งํด ๋ฉ์๋ ์ผ์ชฝ์ ๋ช ์๋ ๊ฐ์ฒด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. (ex. obj.method()) ์ด๋ ๊ฒ ์ด๋ค ๊ฐ์ฒด์ ์ข ์๋๋ค๋ ๋ฉ์๋์ ํน์ง์ this์๋ ๊ทธ๋๋ก ์ ์ฉ์ด ๋๋ค. ๋ฉ์๋๋ก ํธ์ถ๋ this๋ ๋ถ๋ชจ ๊ฐ์ฒด๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ณ ์ (๋ฐ์ธ๋ฉ)๋๊ธฐ ๋๋ฌธ์ด๋ค.
ํจ์๋ก์, ๋ฉ์๋๋ก์ ํธ์ถํ์ ๋์ ์ฐจ์ด์ ์ ์ฝ๋๋ก ์ดํด๋ณด์. ๋จผ์ ๋ค ๋ฒ์งธ ์ค๊น์ง๋ ํจ์๋ก ํธ์ถํ ๊ฒฝ์ฐ์ด๋ค. ํจ์๋ก ํธ์ถํ๋ ๊ฒฝ์ฐ, this๋ ์ ์ญ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๊ธฐ ๋๋ฌธ์ window๊ฐ์ฒด๊ฐ ์ถ๋ ฅ๋๋ค. ๋ฐ๋ฉด ๊ฐ์ฒด์ ๋ฉ์๋๋ก ํธ์ถ๋์์ ๋(obj.method()), this๋ ๋ถ๋ชจ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ์ฌ๊ธฐ์ ๋ถ๋ชจ๊ฐ์ฒด๋ obj ์ด๊ธฐ ๋๋ฌธ์ obj์ ๋ด์ฉ์ธ { method : f } ๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ์ด๋ค.
var func = function(x) {
console.log(this.x);
}
func(10); // window๊ฐ์ฒด 10 (ํจ์๋ก ํธ์ถ)
var obj = {
method : func
}
obj.method(20); // {method : f} 20 (๋ฉ์๋๋ก ํธ์ถ)
4. new ๋ฅผ ์ด์ฉํ ์์ฑ์ ํธ์ถ
์์ฑ์ ํจ์๋ ์ด๋ค ๊ณตํต๋ ์ฑ์ง์ ๊ฐ๋ ๊ฐ์ฒด๋ค์ ์์ฑํ๋๋ฐ ์ฐ์ด๋ ํจ์์ด๋ค. ์ธ์คํด์ค๋ฅผ ์ฐ์ด๋ด๋ ์ผ์ข ์ 'ํ' ๊ฐ์ ์ญํ ์ ํ๋ ๊ฒ์ด๋ค. new ํค์๋๋ ํจ์๊ฐ ๋ฐ๋ก ์ด๋ฐ '์์ฑ์'๋ก ๋์ํ ์ ์๋๋ก ํด์ค๋ค. ์ผ๋จ new์ ํจ๊ป ํจ์๋ฅผ ํธ์ถํ๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๊ฒ ๋๋๋ฐ, ์ด ๊ฐ์ฒด๋ฅผ '์ธ์คํด์ค'๋ผ๊ณ ํ๋ค. ์๋ ์ฝ๋์์๋ new์ ํจ๊ป ํธ์ถ๋ Dog ํจ์๊ฐ bori๋ผ๋ ์ธ์คํด์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ ๊ฒ์ด๋ผ๊ณ ํ ์ ์๋ค. ์ด ๋ฐฉ๋ฒ์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ์ฃผ๋ก ์ฐ์ด๋ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์, ์์ธํ๋ ๋ค์ ๊ธ์์ ๋ฐ๋ก ๋ค๋ฃจ๋ ค๊ณ ํ๋ค.
var Dog = function(name) {
this.bark = '๋ฉ๋ฉ';
this.name = name;
}
var bori = new Dog('๋ณด๋ฆฌ');
์์ฑ์ ํจ์ ๋ด๋ถ๋ฅผ ํ๋ฒ ์ดํด๋ณด์. ์์ฑ์ ํจ์(Dog)๊ฐ ํธ์ถ๋๋ฉด ์๋ก์ด ์ธ์คํด์ค ๊ฐ์ฒด(bori)๊ฐ ์์ฑ๋๋ค๊ณ ํ๋๋ฐ, ์ด๋ ๊ฒ ์๋ก ์์ฑ๋ ๊ฐ์ฒด์ this์๋ ๊ฐ์ฒด์ ์ฑ์ง๋ค์ด ํฌํจ๋๋ค. ์ฌ๊ธฐ์๋ bark๋ผ๋ ๋ฏธ๋ฆฌ ์ง์ ๋ ๊ณตํต์ ์ฑ์ง, ๊ทธ๋ฆฌ๊ณ ๋๊ฒจ๋ฐ๋ ๊ฐ์ ๋ฐ๋ผ ๋ฐ๋๋ name์ด๋ผ๋ ์๋ก์ด ์ฑ์ง์ด ๋ชจ๋ ํด๋น๋๋ค. ์์ ์์ ์์ ์์ฑ์ ํจ์ ๋ด๋ถ์ this๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด ์๋์ ๊ฐ์ ๊ฐ์ฒด๊ฐ ๋์ฌ ๊ฒ์ด๋ค. ์ด์ฒ๋ผ ์์ฑ์ ํจ์ ๋ด๋ถ์ this๋ ์๋ก ์์ฑ๋ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
// Dog { bark : '๋ฉ๋ฉ', name : '๋ณด๋ฆฌ' }
5. call/apply๋ฅผ ํตํ ํธ์ถ
์ง๊ธ๊น์ง์ this๋ ์ด๋ค ๊ท์น์ ์ํด ์ฐ๋ฆฌ๋ ๋ชจ๋ฅด๋ ์ ์ง์ ๋์๋ค. ํ์ง๋ง call์ด๋ apply ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด this๋ฅผ ๋ณ๋์ ๋์์ผ๋ก ์ง์ ํ ์ ์๊ฒ ๋๋ค. ๋ ๋ฉ์๋์ ์ฒซ๋ฒ์งธ ์ธ์๋ก ๋ค์ด๊ฐ๋ ๊ฐ์ด ๋ฐ๋ก this์ด๋ค.
์์๋ฅผ ํตํด call, apply๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ this๊ฐ ๋ฌด์์ ๊ฐ๋ฆฌํค๊ฒ ๋๋ ์ง ์ดํด๋ณด์. call์ ์ฌ์ฉํ์ง ์์์ ๋(func(1, 2))๋ this๋ฅผ ์ง์ ํด์ฃผ์ง ์์๊ธฐ ๋๋ฌธ์, ๊ทธ๋ฅ ํจ์๋ฅผ ํธ์ถํ ๊ฒ์ด๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ๋ฐ๋ผ์ this๋ ์ ์ญ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค. ๋ฐ๋ฉด call์ ์ฌ์ฉํ๋ฉด ์ฒซ๋ฒ์งธ ์ธ์๋ก this๋ฅผ ์ง์ ํ ์ ์๋ค. ์ฌ๊ธฐ์๋ ์ฒซ ์ธ์์ธ {x: 1}๋ผ๋ ๊ฐ์ฒด๊ฐ this๊ฐ ๋๋ ๊ฒ์ด๋ค.
var func = function (a, b) {
console.log(this, a, b);
};
func(1, 2);
// Window{} 1 2 (call ๋ฏธ์ฌ์ฉ)
func.call({x: 1}, 3, 4)
// {x: 1} 3 4 (call ์ฌ์ฉ)
apply๋ call๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ฉฐ ์ฒซ๋ฒ์งธ ์ธ์๊ฐ this๋ผ๋ ๊ฒ๋ ๋์ผํ๋ค. apply๋ ์ธ์๋ค์ ํ๋์ ๋ฐฐ์ด๋ก ๋ฐ๋๋ค๋ ์ ์์๋ง ์ฐจ์ด๊ฐ ์๋ค.
var func = function(a, b) {
console.log(this, a, b);
};
func.apply({x: 1}, [1, 2, 3]);
// {x: 1} 1 2 3
์์ฝ
this๋ ์ด๋ค ์ํฉ์ ๋์ฌ์๋๋์ ๋ฐ๋ผ ๊ฐ์ด ๋ค๋ฅด๊ฒ ๊ฒฐ์ ๋๋ค. ์๋๋ ๋ํ์ ์ธ ๋ค์ฏ๊ฐ์ง ์ํฉ๊ณผ ๊ฐ ์ํฉ์ ๋ฐ๋ฅธ this๊ฐ์ ๋ค์๊ณผ ๊ฐ๋ค!
1. ์ ์ญ ๋ณ์ : ์ ์ญ ๊ฐ์ฒด
2. ํจ์๋ก ํธ์ถ : ์ ์ญ ๊ฐ์ฒด
3. ๋ฉ์๋๋ก ํธ์ถ : ํธ์ถ ์ฃผ์ฒด (๋ฉ์๋๋ช ์ ๊ฐ์ฒด)
4. ์์ฑ์ ํจ์๋ก ํธ์ถ : ์ ์ธ์คํด์ค ๊ฐ์ฒด
5. call, apply ๋ฉ์๋๋ก ํธ์ถ : ์ฒซ๋ฒ์งธ ์ธ์
'Language > Javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
OOP (2) Javascript์ Prototype ๊ธฐ๋ฐ ๊ฐ์ฒด์งํฅ (0) | 2021.01.15 |
---|---|
OOP (1) ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ, ํด๋์ค (0) | 2021.01.14 |
์คํ ์ปจํ ์คํธ(Execution Context) (0) | 2021.01.13 |
undefined ์ ๋๋ก ์๊ธฐ (2) null์ ๋ฑ์ฅ (0) | 2021.01.10 |
undefined ์ ๋๋ก ์๊ธฐ (1) undefined? empty? ๐ง (0) | 2021.01.10 |
๋๊ธ