this(๐ง)
this
๋ค๋ฅธ ๋๋ถ๋ถ์ ๊ฐ์ฒด์งํฅ ์ธ์ด์์ this๋ ํด๋์ค๋ก ์์ฑํ ์ธ์คํด์ค ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ค.
๋ฐ๋ผ์ ํด๋์ค์์๋ง ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ํผ๋์ ์ฌ์ง๊ฐ ๋ง์ง ์๋ค๋ง, ์๋ฐ์คํฌ๋ฆฝํธ์์์ this๋ ์ด๋์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๊ฝค๋ ํผ๋์ค๋ฌ์ด ๊ฐ๋ ์ผ๋ก ์ฌ๊ฒจ์ง๋ค.
์ํฉ์ ๋ฐ๋ผ
์๋ฐ์คํฌ๋ฆฝํธ์์ this๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋ ๋ ํจ๊ป ๊ฒฐ์ ๋๋ค.
์คํ ์ปจํ ์คํธ๋ ํจ์๋ฅผ ํธ์ถํ ๋ ์์ฑ๋จ.
๋ฐ๊ฟ ๋งํ๋ฉด, this๋ ํจ์๋ฅผ ํธ์ถํ ๋ ๊ฒฐ์ ๋๋ค.
์ ์ญ ๊ณต๊ฐ์์์ this
์ ์ญ ๊ณต๊ฐ์์ this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๊ฐ๋ ์ ์ ์ญ ์ปจํ ์คํธ๋ฅผ ์์ฑํ๋ ์ฃผ์ฒด๊ฐ ๋ฐ๋ก ์ ์ญ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ ์ญ ๊ฐ์ฒด๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ด๋ฆ๊ณผ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
var a = 5;
console.log(a); //5
console.log(window.a); //5
console.log(this.a); //5
์ ์ญ ๊ณต๊ฐ์์ ์ ์ธํ ๋ณ์ a์ 5๋ฅผ ํ ๋นํ๋๋ฐ window.a์ this.a ๋ชจ๋ 5๊ฐ ์ถ๋ ฅ๋๋ค.
์ ์ญ ๊ณต๊ฐ์์์ this๋ ์ ์ญ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ฏ๋ก ๋ ๊ฐ์ด ๊ฐ์ ๊ฐ์ ์ถ๋ ฅํ๋ ๊ฒ์ ๋น์ฐํ์ง๋ง, ๊ทธ ๊ฐ์ด 5์ธ ๊ฒ์ ์์ํ๋ค. ๊ทธ ์ด์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ๋ณ์๋ ์ค์ ํน์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ก์ ๋์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ฌ์ฉ์๊ฐ var ์ฐ์ฐ์๋ฅผ ์ด์ฉํด ๋ณ์๋ฅผ ์ ์ธํ๋๋ผ๋ ์ค์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ด๋ค ํน์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ก ์ธ์ํ๋ค. ํน์ ๊ฐ์ฒด๋ ๋ฐ๋ก ์คํ ์ปจํ ์คํธ์ LexicalEnvironment์ด๋ค.
์คํ ์ปจํ ์คํธ๋ ๋ณ์๋ฅผ ์์งํด์ L.E์ ํ๋กํผํฐ๋ก ์ ์ฅํ๊ณ ์ดํ ์ด๋ค ๋ณ์๋ฅผ ํธ์ถํ๋ฉด L.E๋ฅผ ์กฐํํด์ ์ผ์นํ๋ ํ๋กํผํฐ๊ฐ ์์ ๊ฒฝ์ฐ ๊ทธ ๊ฐ์ ๋ฐํํ๋ค. ์ ์ญ ์ปจํ ์คํธ์ ๊ฒฝ์ฐ L.E๋ ์ ์ญ๊ฐ์ฒด๋ฅผ ๊ทธ๋๋ก ์ฐธ์กฐํ๋ค.
์ ์ญ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ด๋ฅผ ์ ์ญ๊ฐ์ฒด์ ํ๋กํผํฐ๋ก ํ ๋นํ๋ค.
๊ทธ๋ผ window.a๋ this.a๊ฐ 5๊ฐ ๋์ค๋ ์ด์ ๋ ์ค๋ช ๋๋๋ฐ, a๋ฅผ ์ง์ ํธ์ถํ ๋๋ 5๊ฐ ๋์ค๋ ๊น๋ญ์ ๋ฌด์์ผ๊น?
์ด๋ ๋ณ์ a์ ์ ๊ทผํ๊ณ ์ ํ๋ฉด ์ค์ฝํ ์ฒด์ธ์์ a๋ฅผ ๊ฒ์ํ๋ค๊ฐ ๊ฐ์ฅ ๋ง์ง๋ง์ ๋๋ฌํ๋ ์ ์ญ ์ค์ฝํ์ L.E, ์ฆ ์ ์ญ๊ฐ์ฒด์์ ํด๋น ํ๋กํผํฐ a๋ฅผ ๋ฐ๊ฒฌํด์ ๊ทธ ๊ฐ์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฆฌ๋ ์ด๋ ์ง๋ง ๋จ์ํ๊ฒ (window. )์ด ์๋ต๋ ๊ฒ์ด๋ผ๊ณ ์ฌ๊ฒจ๋ ๋ฌด๋ฐฉํ๋ค.
๋ฉ์๋๋ก์ ํธ์ถํ ๋ ๊ทธ ๋ฉ์๋ ๋ด๋ถ์์์ this
์ด๋ค ํจ์๋ฅผ ์คํํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ ๋ ๊ฐ์ง๋ ํจ์๋ก์ ํธ์ถํ๋ ๊ฒฝ์ฐ์ ๋ฉ์๋๋ก์ ํธ์ถํ๋ ๊ฒฝ๊ตฌ๊ฐ ์๋ค. ํจ์์ ๋ฉ์๋๋ฅผ ๊ตฌ๋ถํ๋ ์ ์ผํ ์ฐจ์ด๋ ๋ ๋ฆฝ์ฑ์ ์๋ค.
ํจ์๋ ๊ทธ ์์ฒด๋ก ๋ ๋ฆฝ์ ์ธ ๊ธฐ๋ฅ์ ์ํ / ๋ฉ์๋๋ ์์ ์ ํธ์ถํ ๋์ ๊ฐ์ฒด์ ๊ดํ ๋์์ ์ํํจ.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ํฉ๋ณ๋ก this ํค์๋์ ๋ค๋ฅธ ๊ฐ์ ๋ถ์ฌํ๊ฒ ํจ์ผ๋ก์จ ์ด๋ฅผ ๊ตฌํ.
var func = function(x){
console.log(this, x);
};
func(1); //Window {...}1
var obj = {
method: func
};
obj.method(2); // {method: f}2
-
func๋ผ๋ ์ต๋ช ํจ์๋ฅผ ํ ๋น
-
4๋ฒ์งธ ์ค funcํธ์ถ, this๋ก ์ ์ญ๊ฐ์ฒด Window ์ถ๋ ฅ.
-
6๋ฒ์งธ์ค obj๋ผ๋ ๋ณ์์ ๊ฐ์ฒด ํ ๋น, ๊ฐ์ฒด์ method ํ๋กํผํฐ์ funcํจ์ ํ ๋น
-
9์งธ ์ค์ obj์ method ํธ์ถ, ์ด๋ฒ์๋ this๊ฐ obj.
obj์ methodํ๋กํผํฐ์ ํ ๋นํ ๊ฐ๊ณผ func ๋ณ์์ ํ ๋นํ ๊ฐ์ ๋ชจ๋ 1๋ฒ์งธ ์ค์์ ์ ์ธํ ํจ์๋ฅผ ์ฐธ์กฐ.
-
์ฆ ์๋์ ์ต๋ช ํจ์๋ ๊ทธ๋๋ก / ์ด๋ฅผ ๋ณ์์ ๋ด์ ํธ์ถํ ๊ฒฝ์ฐ์ obj๊ฐ์ฒด์ ํ๋กํผํฐ์ ํ ๋นํด์ ํธ์ถํ ๊ฒฝ์ฐ์ this๊ฐ ๋ฌ๋ผ์ง.
=> ํจ์๋ก์ ํธ์ถ, ๋ฉ์๋๋ก์ ํธ์ถ ๊ตฌ๋ถ ๋ฐฉ๋ฒ์ ํจ์ ์์ ์ (.)์ด ์๋์ง ์ฌ๋ถ๋ง์ผ๋ก ๊ฐ๋จํ๊ฒ ๊ตฌ๋ถ ๊ฐ๋ฅ
var obj ={
method: function(x){console.log(this, x);}
};
obj.method(1); // ์ ํ๊ธฐ๋ฒ {method: f } 1
obj.['method'](2); // ๋๊ดํธ ํ๊ธฐ๋ฒ {method: f } 2
๋ฉ์๋ ๋ด๋ถ์์์ this
this์๋ ํธ์ถํ ์ฃผ์ฒด์ ๋ํ ์ ๋ณด๊ฐ ๋ด๊ธด๋ค. ์ด๋ค ํจ์๋ฅผ ๋ฉ์๋๋ก์ ํธ์ถํ๋ ๊ฒฝ์ฐ ํธ์ถ ์ฃผ์ฒด๋ ๋ฐ๋ก ํจ์๋ช (ํ๋กํผํฐ๋ช ) ์์ ๊ฐ์ฒด์ด๋ค. ์ ํ๊ธฐ๋ฒ์ ๊ฒฝ์ฐ ๋ง์ง๋ง ์ ์์ ๋ช ์๋ ๊ฐ์ฒด๊ฐ ๊ณง this๊ฐ ๋๋ ๊ฒ์ด๋ค.
var obj = {
methodA: function (){console.log(this);},
inner: {
methodB: function (){console.log(this);}
}
};
obj.methodA(); //{methodA: f, inner: {...}} (===obj)
obj['methodA'](); //{methodA: f, inner: {...}} (===obj)
obj.inner.methodB(); //{methodB: f} (===obj.inner)
obj.inner['methodB'](); //{methodB: f} (===obj.inner)
obj['inner'].methodB(); //{methodB: f} (===obj.inner)
obj['inner']['methodB'](); //{methodB: f} (===obj.inner)
ํจ์๋ก์ ํธ์ถํ ๋ ๊ทธ ํจ์ ๋ด๋ถ์์์ this
ํจ์ ๋ด๋ถ์์์ this
์ด๋ค ํจ์๋ฅผ ํจ์๋ก์ ํธ์ถํ ๊ฒฝ์ฐ์๋ this๊ฐ ์ง์ ๋์ง ์๋๋ค.(this์๋ ํธ์ถํ ์ฃผ์ฒด์ ๋ํ ์ ๋ณด๊ฐ ๋ด๊น)
ํจ์๋ก์ ํธ์ถํ๋ ๊ฒ์ ํธ์ถ ์ฃผ์ฒด(๊ฐ์ฒด์งํฅ ์ธ์ด์์์ ๊ฐ์ฒด)๋ฅผ ๋ช ์ํ์ง ์๊ณ ๊ฐ๋ฐ์๊ฐ ์ฝ๋์ ์ง์ ๊ด์ฌํด์ ์คํํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํธ์ถ ์ฃผ์ฒด์ ์ ๋ณด๋ฅผ ์ ์ ์๋ ๊ฒ.( ์คํ ์ปจํ ์คํธ๋ฅผ ํ์ฑํํ ๋น์์ this๊ฐ ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณธ๋ค)
๋ฐ๋ผ์ ํจ์์์์ this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํด.
Leave a comment