ํ•จ์ˆ˜์˜ ์•”์‹œ์  ํŒŒ๋ผ๋ฏธํ„ฐ - this #1

์•”์‹œ์  ํŒŒ๋ผ๋ฏธํ„ฐ์ธ this์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

Jul 25, 2021

๊น€ํ˜„๊ธฐ

#JS

ํ•จ์ˆ˜์˜ ์•”์‹œ์  ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” 4ํŽธ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. arguments
  2. this-1
  3. this-2
  4. this-3

๋“ค์–ด๊ฐ€๋ฉฐ

์ง€๋‚œ ๊ธ€์—์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜์—์„œ ์•”์‹œ์ ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ arguments์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ดค๋Š”๋ฐ์š”

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” this์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

this

ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์•”์‹œ์ ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ arguments์™ธ์— this๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ1

function myThis() {
  console.log(this);
}
myThis();

์˜ˆ์ œ2

const obj = {
  value: 10,
  myThis: function () {
    return this;
  },
};
console.log(obj.myThis() === obj);

์˜ˆ์ œ 1๊ณผ ์˜ˆ์ œ 2์—์„œ ์ฝ˜์†”์— ์ฐํžˆ๋Š” ๊ฐ’์ด ๋ฌด์—‡์ผ๊นŒ์š”?

jsfiddle์—์„œ ํ™•์ธํ•ด์ฃผ์„ธ์š”

this์˜ ๊ฐ’์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ธฐ์ค€์€ ๋ฌด์—‡์ผ๊นŒ์š”?

ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๊ฒฐ์ •๋˜๋Š” this์˜ ๊ฐ’

ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์—๋Š” ํฌ๊ฒŒ 4๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ(As a function): myThis() ์ฒ˜๋Ÿผ ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹
  2. ๋ฉ”์„œ๋“œ๋กœ์„œ ํ˜ธ์ถœ(As a method): obj.myThis() ์ฒ˜๋Ÿผ ํ˜ธ์ถœ์„ ๊ฐ์ฒด์— ์—ฐ๊ฒฐํ•˜์—ฌ ํ˜ธ์ถœ
  3. ์ƒ์„ฑ์ž๋กœ์„œ ํ˜ธ์ถœ(As a constructor): new MyThis() ์ฒ˜๋Ÿผ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ˜ธ์ถœ
  4. call ๋ฐ apply๋ฅผ ํ†ตํ•ด์„œ ํ˜ธ์ถœ(Via this functionโ€™s apply or call method): Function ๊ฐ์ฒด์˜ call, apply ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ํ˜ธ์ถœ

ํ•˜๋‚˜ํ•˜๋‚˜ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ(As a function)

ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ทธ๋ƒฅ ์šฐ๋ฆฌ๊ฐ€ ํ‰์†Œ์— ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜๋กœ์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด this์˜ ๊ฐ’์€ ๋น„ ์—„๊ฒฉ ๋ชจ๋“œ, ์—„๊ฒฉ ๋ชจ๋“œ์— ๋”ฐ๋ผ์„œ 2๊ฐ€์ง€๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋น„ ์—„๊ฒฉ ๋ชจ๋“œ
  2. ์—„๊ฒฉ ๋ชจ๋“œ (Strict mode)

๋น„ ์—„๊ฒฉ ๋ชจ๋“œ

function sayHi() {
  console.log(this === window); // true
}
sayHi();

let sayHi = function () {
  console.log(this === window); // true
};
sayHi();

๋น„ ์—„๊ฒฉ ๋ชจ๋“œ์—์„œ๋Š” ์œ„ ์˜ˆ์ œ์ฒ˜๋Ÿผ ๋ธŒ๋ผ์šฐ์ €์˜ ์ „์—ญ๊ฐ์ฒด์ธ window๋กœ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

์—„๊ฒฉ ๋ชจ๋“œ

'use strict';

function sayHi() {
  console.log(this === undefined); // true
}
sayHi();

let sayHi = function () {
  console.log(this === undefined); // true
};
sayHi();

ํ•˜์ง€๋งŒ โ€œuse strictโ€๋ฅผ ์‚ฌ์šฉํ•œ ์—„๊ฒฉ ๋ชจ๋“œ์—์„œ๋Š” undefined๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

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

์˜ˆ์ œ 2์ฒ˜๋Ÿผ ํ•จ์ˆ˜๊ฐ€ ๊ฐ์ฒด์˜ ์†์„ฑ(property)์— ํ• ๋‹น๋˜๊ณ  ํ•ด๋‹น ์†์„ฑ์„ ์‚ฌ์šฉํ•ด์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ๋กœ์„œ ํ˜ธ์ถœ์—์„œ ์ค‘์š”ํ•œ ์ ์€

๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋Š” ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋˜๊ณ  this ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜ ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋ฌด์Šจ ๋œป์ธ์ง€ ์•Œ์•„๋ณผ๊นŒ์š”?

// ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜
function whatsMyContext() {
  return this;
}
// 0. ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ
console.log(whatsMyContext() === window); // ?

// 1. whatsMyContext ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐ
const getMythis = whatsMyContext;
console.log(getMythis() === window); // ?

// 2. ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ ์ฐธ์กฐํ•ด์„œ ํ˜ธ์ถœ
const obj = {
  getMyThis: whatsMyContext,
};
console.log(obj.getMyThis() === obj); // ?

whatsMyContext๋Š” ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋‹จ์ˆœํžˆ this๋งŒ์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

0๋ฒˆ์˜ ๊ฒฐ๊ณผ

0๋ฒˆ์˜ ๊ฒฝ์šฐ์—๋Š” ๋น„ ์—„๊ฒฉ ๋ชจ๋“œ์—์„œ ํ•จ์ˆ˜๋ฅผํ˜ธ์ถœ ํ–ˆ์œผ๋ฏ€๋กœ ์ „์—ญ ๊ฐ์ฒด์ธ window๊ฐ€ ์ถœ๋ ฅ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ๋Œ๋ ค๋ณด๋ฉด true์ž…๋‹ˆ๋‹ค.

1๋ฒˆ์˜ ๊ฒฐ๊ณผ

1๋ฒˆ์˜ ๊ฒฝ์šฐ๋Š” ๋‹จ์ˆœํžˆ whatsMyContext ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” true์ž…๋‹ˆ๋‹ค.

2๋ฒˆ์˜ ๊ฒฐ๊ณผ

2๋ฒˆ์˜ ๊ฒฝ์šฐ๋Š” obj๋ผ๋Š” ๊ฐ์ฒด์˜ getMyThis๋ผ๋Š” ์†์„ฑ์— ๊ฐ’์œผ๋กœ whatsMyContext ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ๋ฉ”์„œ๋“œ๋กœ์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•ด์•ผ ํ• ์ ์€ obj ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋Š” getMyThis๋ผ๊ณ  ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. whatsMyContext๊ฐ€ ๋ฉ”์„œ๋“œ๊ฐ€ ๋œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฒฐ๊ณผ๋ฅผ ์‚ดํŽด๋ณด๋ฉด true ์ž…๋‹ˆ๋‹ค.

true์ธ ์ด์œ ๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ์ค‘์š”ํ•œ ์ ์— ์ •ํ™•ํžˆ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋Š” ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋˜๊ณ  this ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜๋‚ด์—์„œ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค

ํ•ด๋‹น ๊ฐ์ฒด obj๊ฐ€ whatsMyContext์˜ ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ํ•œ๋ฒˆ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ํ™•์ธ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

// 3. 2๋ฒˆ๊ณผ ๋™์ผํ•˜์ง€๋งŒ ์ƒˆ๋กœ์šด obj2๋ผ๋Š” ๊ฐ์ฒด์˜ ๋งค์„œ๋“œ๋กœ ํ˜ธ์ถœ
const obj2 = {
  getMyThis: whatsMyContext,
};
console.log(obj2.getMyThis() === obj); // false
console.log(obj2.getMyThis() === obj2); // true

obj, obj2์—์„œ ๋ฉ”์„œ๋“œ๋กœ์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ๊ฐ ๋‹ค๋ฅธ ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ˜•์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ฉ”์„œ๋“œ๋กœ์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ†ตํ•ด์„œ ๋ฉ”์„œ๋“œ์˜ ์†Œ์œ  ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐ๊ฐ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ๋™์ผํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜์˜ ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด์„œ ๊ฐ์ฒด์ง€ํ–ฅ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„ ์˜ˆ์ œ๋“ค์€ jsfiddle์—์„œ ํ™•์ธํ•ด์ฃผ์„ธ์š”

๋งˆ์น˜๋ฉฐ

์•”์‹œ์ ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ this์˜ ๊ฐ’์€ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฒฐ์ •๋˜๋Š”๋ฐ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š”

  1. ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ
  2. ๋ฉ”์„œ๋“œ๋กœ์„œ ํ˜ธ์ถœ

์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ƒ์„ฑ์ž๋กœ์„œ ํ˜ธ์ถœ, call ๋ฐ apply๋ฅผ ํ†ตํ•œ ํ˜ธ์ถœ์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋ฌธ์„œ

Grow & Glow ยฉ 2025

Banner images by undraw.co