2 minute read

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๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด.

๋ฉ”์„œ๋“œ์˜ ๋‚ด๋ถ€ํ•จ์ˆ˜์—์„œ์˜ this

Leave a comment