๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
javascript/๐Ÿ“– study

[4์ฃผ์ฐจ ์Šคํ„ฐ๋””] 22์žฅ- this

by HomieKim 2022. 2. 23.

this

this์˜ ์ •์˜

this๋Š” ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด ๋˜๋Š” ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ž๊ธฐ์ฐธ์กฐ ๋ณ€์ˆ˜
this๋ฅผ ํ†ตํ•ด ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด ๋˜๋Š” ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

this์˜ ํ•„์š”์„ฑ

  • ๊ฐ์ฒด๋Š” ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

    ํ”„๋กœํผํ‹ฐ : ์ƒํƒœ(state)๋ฅผ ๋‚˜ํƒ€๋ƒ„
    ๋ฉ”์„œ๋“œ : ๋™์ž‘์„ ๋‚˜ํƒ€๋ƒ„

  • ๊ฐ์ฒด๋Š” ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊น€
  • ์ž์‹ ์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋ ค๋ฉด ์šฐ์„  ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๊ฒฝ์šฐ newํ‚ค์›Œ๋“œ๋กœ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ instance๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์ฆ‰, ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ์‹œ์ ์— ์ƒ์„ฑ๋  ์˜ˆ์ •์ธ instance๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹๋ณ„์ž๊ฐ€ ํ•„์š” (= this)

this ๋ฐ”์ธ๋”ฉ

  • this๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’, this ๋ฐ”์ธ๋”ฉ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ์˜ํ•ด ๋™์ ์œผ๋กœ ๊ฒฐ์ •

    ๋ฐ”์ธ๋”ฉ์ด๋ž€ ์‹๋ณ„์ž์™€ ๊ฐ’์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •์„ ์˜๋ฏธ, this ๋ฐ”์ธ๋”ฉ์€ this๊ฐ€ ๊ฐ€๋ฆฌํ‚ฌ ๊ฐ์ฒด๋ฅผ ๋ฐ”์ธ๋”ฉ ํ•˜๋Š” ๊ฒƒ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ this๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ this์— ๋ฐ”์ธ๋”ฉ ๋  ๊ฐ’์ด ๋™์ ์œผ๋กœ ๊ฒฐ์ • ๋œ๋‹ค.

ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹๊ณผ this ๋ฐ”์ธ๋”ฉ

  • this์— ๋ฐ”์ธ๋”ฉ๋  ๊ฐ’์€ ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ(ํ•จ์ˆ˜ ์ƒ์„ฑ ์‹œ์ ๊ณผ ๊ตฌ๋ถ„ํ•˜๊ธฐ) ๋˜์—ˆ๋Š”์ง€์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค.
  • ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์€ ๋‹ค์–‘ํ•จ
    1. ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ
    2. ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
    3. ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ
    4. Function.prototype.apply/call/bind์— ์˜ํ•œ ๊ฐ„์ ‘ ํ˜ธ์ถœ

์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ

  • ๊ธฐ๋ณธ์ ์œผ๋กœ this์—๋Š” ์ „์—ญ ๊ฐ์ฒด(global object)๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.
  • ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๋ฉด ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this ์—๋Š” ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
  • strict mode ์˜ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋Š” undefined(์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this ์‚ฌ์šฉ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ)
  • (์ค‘์ฒฉ ํ•จ์ˆ˜, ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•œ)์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋œ ๋ชจ๋“  ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ tihs์—๋Š” ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค

    ์ค‘์ฒฉํ•จ์ˆ˜๋‚˜ ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ this๋ฅผ ์ผ์น˜ ์‹œ์ผœ์ฃผ๊ธฐ ์œ„ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์ œ๊ณต ๋œ๋‹ค.

๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

  • ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜this๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์†Œ์œ ํ•œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
  • ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœํผํ‹ฐ์— ๋ฐ”์ธ๋”ฉ๋œ ํ•จ์ˆ˜๋‹ค => ์ฆ‰ ๊ฐ์ฒด์— ํฌํ•จ ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌ
  • ๋”ฐ๋ผ์„œ ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด์— ์˜ํ•ด ํ˜ธ์ถœ ๋  ์ˆ˜ ์žˆ๊ณ  ์ผ๋ฐ˜ ๋ณ€์ˆ˜์— ํ• ๋‹น ํ•˜์—ฌ ์ผ๋นˆ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ ๋  ์ˆ˜๋„ ์žˆ๋‹ค.
const anotherPerson = {
  name: 'Kim'
};
// getName ๋ฉ”์„œ๋“œ๋ฅผ anotherPerson ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ ํ• ๋‹น
anotherPerson.getName = person.getName;

// getName ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๋Š” anotherPerson์ด๋‹ค.
console.log(anotherPerson.getName()); // Kim

// getName ๋ฉ”์„œ๋“œ๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹น
const getName = person.getName;

// getName ๋ฉ”์„œ๋“œ๋ฅผ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ
console.log(getName()); // ''
// ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋œ getName ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this.name์€ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ window.name๊ณผ ๊ฐ™๋‹ค.
// ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ window.name์€ ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์˜ ์ด๋ฆ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋นŒํŠธ์ธ ํ”„๋กœํผํ‹ฐ์ด๋ฉฐ ๊ธฐ๋ณธ๊ฐ’์€ ''์ด๋‹ค.
// Node.js ํ™˜๊ฒฝ์—์„œ this.name์€ undefined๋‹ค.

์ •๋ฆฌ : ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜ this๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.

์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ

  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ (๋ฏธ๋ž˜์—) ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” new์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ์ผ๋ฐ˜ํ•จ์ˆ˜๋กœ ๋™์ž‘
// new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ด๋‹ค.
const circle3 = Circle(15);

// ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋œ Circle์—๋Š” ๋ฐ˜ํ™˜๋ฌธ์ด ์—†์œผ๋ฏ€๋กœ ์•”๋ฌต์ ์œผ๋กœ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
console.log(circle3); // undefined

// ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋œ Circle ๋‚ด๋ถ€์˜ this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
console.log(radius); // 15

Function.prototype.apply / call / bind์— ์˜ํ•œ ๊ฐ„์ ‘ ํ˜ธ์ถœ

  • apply, call, bind๋Š” Function.prototype์˜ ๋ฉ”์„œ๋“œ๋กœ ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ์ƒ์† ๋ฐ›์•„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • apply์™€ call์˜ ๋ณธ์งˆ์ ์ธ ๊ธฐ๋Šฅ์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ, ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ apply๋‚˜ call์— ํŠน์ • ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์˜ this์— ๋ฐ”์ธ๋”ฉํ•จ
  • bind ๋ฉ”์„œ๋“œ๋Š” apply, call๊ณผ ๋‹ฌ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‹ค๋งŒ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ๊ฐ’์œผ๋กœ this ๋ฐ”์ธ๋”ฉ์ด ๊ต์ฒด๋œ ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜
  • bind๋Š” ์ค‘์ฒฉํ•จ์ˆ˜ ๋˜๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ this๊ฐ€ ๋ถˆ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋จ

์ •๋ฆฌ

ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹ this ๋ฐ”์ธ๋”ฉ
์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ „์—ญ ๊ฐ์ฒด
๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด
์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ (๋ฏธ๋ž˜์—) ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค
apply ๋ฉ”์„œ๋“œ ๋“ฑ์— ์˜ํ•œ ๊ฐ„์ ‘ ํ˜ธ์ถœ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ๊ฐ์ฒด

๋Œ“๊ธ€