๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Language/Javascript

this(1) ์ƒํ™ฉ๋”ฐ๋ผ ๋ฐ”๋€Œ๋Š” this

by joooing 2021. 1. 14.
๋ฐ˜์‘ํ˜•

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 ๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœ : ์ฒซ๋ฒˆ์งธ ์ธ์ž

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€