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

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

Dec 4, 2021

๊น€ํ˜„๊ธฐ

#JS

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

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

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

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

  1. ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ
  2. ๋ฉ”์„œ๋“œ๋กœ์„œ ํ˜ธ์ถœ
  3. ์ƒ์„ฑ์ž๋กœ์„œ ํ˜ธ์ถœ
  4. call ๋ฐ apply๋ฅผ ํ†ตํ•œ ํ˜ธ์ถœ

ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ

์ง€๊ธˆ๊นŒ์ง€ ์‚ดํŽด๋ณธ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ๋ฒ•๋“ค์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ ์‹คํ–‰ ์ค‘์ธ ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ์•”์‹œ์  ํŒŒ๋ผ๋ฏธํ„ฐ์ธ this์— ์˜ํ•ด ์ฐธ์กฐ๋˜๋Š” ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

์™œ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์–ด ํ•˜๋Š”์ง€ ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด ๋ด…์‹œ๋‹ค.

function junggle() {
  const numbers = [...arguments]
  const result = numbers.reduce((acc, current) => acc + current)
  this.result = result
  console.log(this)
}
junggle([1, 2, 3])

์œ„ ์ฝ”๋“œ๋Š” ๊ธ€๋กœ๋ฒŒ ์Šค์ฝ”ํ”„์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— this๋Š” window ๊ฐ์ฒด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ์— ์ด juggle ํ•จ์ˆ˜์˜ result๋ผ๋Š” ์†์„ฑ์„ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฐ์ฒด์˜ ์†์„ฑ์œผ๋กœ ํ• ๋‹นํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

apply, call

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ๋กœ ์›ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์กด์žฌํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ธ apply ๋ฐ call ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

apply ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด apply์— ๋‘ ๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด
  2. ํ˜ธ์ถœ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ๊ฐ’์˜ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.

call ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด apply์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‘ ๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

  1. ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด
  2. ํ˜ธ์ถœ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ๊ฐ’์˜ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

1๋ฒˆ์€ ๋˜‘๊ฐ™๊ณ  2๋ฒˆ์˜ ์ฐจ์ด์ธ๋ฐ์š” ์•„๋ž˜ ์˜ˆ์ œ ์ฝ”๋“œ๋กœ ์‚ดํŽด๋ด…์‹œ๋‹ค.

function junggle() {
  const numbers = [...arguments]
  const result = numbers.reduce((acc, current) => acc + current)
  this.result = result
}

const ninja1 = {}
const ninja2 = {}

junggle.apply(ninja1, [1,2,3,4]); // ๊ฐ’์˜ ๋ฐฐ์—ด
junggle.call(ninja2, 5,6,7,8); // ๊ฐ’์˜ ๋ชฉ๋ก

console.log(ninja1.result) // 10
console.log(ninja2.result) // 26

junggle์ด๋ผ๋Š” ํ•จ์ˆ˜์—์„œ this.result์— arguments๋“ค์˜ ํ•ฉ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ๋กœ ์‚ฌ์šฉํ•  ๋‘ ๊ฐœ์˜ ๊ฐ์ฒด ninja1, ninja2๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

ninja1์—๋Š” ๊ฐ’ ๋ฐฐ์—ด์„ ๋„˜๊ธฐ๊ณ  ninja2์—๋Š” ๊ฐ’ ๋ชฉ๋ก์„ ๋„˜๊น๋‹ˆ๋‹ค.

ํ•จ์ˆ˜์˜ ์ปจํ…์ŠคํŠธ์™€ ์ธ์ˆ˜๋ฅผ ์ œ๊ณตํ•œ ํ›„ ๊ฐ’์„ ํ™•์ธํ•˜๋ฉด ninja1, ninja2์— result๋ผ๋Š” ์†์„ฑ๊ณผ ๊ฐ’์ด ์ž˜ ํ• ๋‹น๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ๋Š” jsfiddle์—์„œ ํ™•์ธํ•ด ์ฃผ์„ธ์š”!

๋งˆ์น˜๋ฉฐ

์ด๋ฒˆ์žฅ์„ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•จ์ˆ˜์˜ ์•”์‹œ์  ํŒŒ๋ผ๋ฏธํ„ฐ์ธ arguments์™€ this๊ฐ€ ๋งˆ๋ฌด๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํŽธ์—๋Š” ์‹ค๋ฌด์—์„œ ์ž์ฃผ ์‹ค์ˆ˜ํ•˜๊ณ  ์•Œ๊ฒŒ ๋ชจ๋ฅด๊ฒŒ ๋„˜์–ด๊ฐ€๋Š” ์˜ˆ์ œ ํ•˜๋‚˜๋ฅผ ์„ค๋ช…ํ•ด ๋“œ๋ฆด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ํŽธ๋„ ๊ธฐ๋Œ€ํ•ด ์ฃผ์„ธ์š”.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋ฌธ์„œ

Grow & Glow ยฉ 2025

Banner images by undraw.co