๐ŸŽ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (12) ์šฉ๋ณ‘ Call, ๋ถ„์‹ ์ˆ ์˜ Bind

๐Ÿ‘ปํ•จ์ˆ˜์˜ ๋ณ€ํ™”๋ฌด์Œํ•จ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์—์„œ ํ•จ์ˆ˜๋Š”

  1. ํ˜ผ์ž ์žˆ์œผ๋ฉด ๊ฐœ์ธ ํƒ์‹œ
  2. new ๊ฐ€ ์•ž์— ์žˆ์œผ๋ฉด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ์‹  (๊ฐ“)์ด ๋˜๊ณ 
  3. call ์„ ๋’ค์— ๋ถ™์ด๋ฉด ์šฉ๋ณ‘์ด ๋˜๊ณ 
  4. bind ๋ฅผ ๋’ค์— ๋ถ™์ด๋ฉด ๋ถ„์‹ ์ˆ ์„ ๋ถ€๋ฆฌ๋Š”

๋†€๋ผ์šด ์กด์žฌ์ด๋‹ค. ๊ทธ๋งŒํผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์œ ์—ฐํ•˜๋ฉฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ฐธ ๋ณ€ํ™”๋ฌด์Œํ•ด ์ง€๋Š”๊ตฌ๋‚˜.

๐Ÿ›ฃ๋ฐ‘์ž‘์—…

์ด์ œ object ์™€ function ์˜ ๊ด€๊ณ„๋ฅผ ๊ทœ์ •ํ•ด ๋ณด์ž.

const kim = { name: 'kim', first: 10, second: 20 }

const lee = { name: 'lee', first: 10, second: 10 }

์„œ๋กœ ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ๋‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ๊ณ , ์–ด๋–ค ๊ฐ์ฒด์˜.first ๊ทธ๋ฆฌ๊ณ  second ๊ฐ’์„ ๋”ํ•ด ๋ฆฌํ„ดํ•˜๋Š” ๊ธฐ๋Šฅ์˜ sum() ํ•จ์ˆ˜๋ฅผ ๊ทธ๋ƒฅ ๋ฐ–์—๋‹ค ์„ ์–ธํ•ด ๋†“์•˜๋‹ค.

function sum() {
  return this.first + this.second
}

์˜ค์ž‰? sum() ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ์–ด๋–ค ๊ฐ์ฒด์—๋„ ์†ํ•ด ์žˆ์ง€ ์•Š๋‹ค. ํ˜ผ์ž ์™•๋”ฐ์ฒ˜๋Ÿผ ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค.

์–ด์จ‹๋“  ๊ฐ์ฒด ๋‚ด์˜ first ์™€ second ๋ฅผ ๋”ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” sum(),

์ด์ œ ์–ด๋–ป๊ฒŒ ์จ์ค˜์•ผ ํ• ๊นŒ?

๐Ÿ“ฒsum.call(kim)

sum.call()

sum ์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค๋Š” ์˜๋ฏธ์ธ๋ฐ, sum() ๊ณผ ์˜๋ฏธ๊ฐ€ ๊ฐ™๋‹ค.

๊ทธ๋Ÿผ ์™œ call ์„ ๋ถ™์—ฌ ์“ฐ๋Š”๊ฑด๊ฐ€ ํ•˜๋ฉด,

์ผ๋‹จ call() ์ด๋ผ๊ณ  ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋Š” ์–ด.. ๋ชจ๋“  ํ•จ์ˆ˜๋Š” call ์ด๋ผ๊ณ  ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

call ์ด๋ผ๊ณ  ํ•˜๋Š” ํ•จ์ˆ˜์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ kim ์„ ์ฃผ๋ฉด,

sum.call(kim)

function sum() {
  return this.first + this.second
} //sum.call(kim)๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์ ์œผ๋กœ this ๊ฐ€ kim ์ด ๋œ๋‹ค.

30

์ฆ‰, sum() ์ด๋ผ๋Š” ํ•จ์ˆ˜๋Š” ๋ณธ๋ž˜ kim ์ด๋ผ๋Š” ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„๊ฐ€ ์•„๋‹ˆ์˜€๋‹ค. ์•„๊นŒ ๋งํ–ˆ๋“  ํ˜ผ์ž ๋†€๊ณ  ์žˆ์—ˆ๋‹ค.

๊ทผ๋ฐ sum ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด์„œ ๊ฐ‘์ž๊ธฐ call ์ด๋ผ๊ณ  ํ•˜๋Š” ํŠน์ดํ•œ ๊ฑธ ์จ๊ฐ€์ง€๊ณ ์„œ๋Š”,

call ์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ sum ์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•  this ์˜ ๊ฐ’์„ kim ์œผ๋กœ ์ง€์ •ํ–ˆ๋”๋‹ˆ,

sum ์ด๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋น„๋กœ์†Œ kim ์˜ ๋ฉค๋ฒ„์ธ ๋ฉ”์„œ๋“œ๊ฐ€ ๋˜์—ˆ๋‹ค.

๐Ÿ“ฒsum.call(kim) ์˜ ๋‘๋ฒˆ์งธ ์ธ์ž

๊ทธ๋ฆฌ๊ณ  sum.call(kim) ์€ ์ธ์ž๋ฅผ ๋ช‡๊ฐœ ๋” ๋ฐ›์„ ์ˆ˜๋„ ์žˆ๋‹ค.

function sum(bonusP) {
  return bonusP + (this.first + this.second)
}
sum.call(kim)
NaN

๊ธฐ์กด ์ •์˜ํ•ด ๋†“์€ sum ํ•จ์ˆ˜๊ฐ€ bonusP ๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›๊ณ  ๊ธฐ์กด ๊ฐ’์— bonusP ๋ฅผ ๋”ํ•œ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋„๋ก ์ˆ˜์ •ํ•˜๊ณ  sum ํ•จ์ˆ˜์— kim ๊ฐ์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์™€ ์‹คํ–‰ํ–ˆ๋‹ค.

์œ„์˜ ๊ฒฐ๊ณผ์ฒ˜๋Ÿผ NaN ๊ฐ€ ๋‚˜์˜จ๋‹ค.

์ฆ‰ bonusP ๊ฐ€ ์—†๋Š” ๊ฐ’์ด๋‹ค. ์—†๋Š” ๊ฐ’์— ๋”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋Œ€๋กœ ์‹คํ–‰์ด ๋˜์ง€ ์•Š์•˜๋‹ค.

๊ทธ๋ฆฌํ•ด์„œ,

sum.call(kim, 100)
130

call ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ๋Š” ๊ทธ ํ•จ์ˆ˜์— ๋‚ด๋ถ€์ ์œผ๋กœ this ๋ฅผ ๋ญ˜๋กœ ํ•  ๊ฒƒ์ธ๊ฐ€ ๊ฐ€ ์˜ค๊ฒŒ ๋˜๊ณ ,

๋‘ ๋ฒˆ์งธ ์ธ์ž๋ถ€ํ„ฐ๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ˜ธ์ถœํ•˜๋ ค๋Š” ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— (bonusP) ๋“ค์–ด๊ฐˆ ์ธ์ž๊ฐ’๋“ค์ด ๋“ค์–ด๊ฐ„๋‹ค.

์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์–ด๋–ค ๊ฐ์ฒด์˜ this ๊ฐ’์„ ๋ฐ”๊พธ๋Š”, ๋‹ค์‹œ๋งํ•ด context ๋ฅผ ๋ฐ”๊พธ๋Š” ๋ช…๋ น์–ด call ์— ๋Œ€ํ•ด ํ•™์Šตํ•ด ๋ณด์•˜๋‹ค.

๐Ÿฆฅbind

์—ฎ๋Š”๋‹ค. ๋ฌถ๋Š”๋‹ค์˜ ์˜๋ฏธ์ธ bind

sum ์ด๋ผ๊ณ  ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค this ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์•„์˜ˆ ํ•จ์ˆ˜์— ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•  this ๋ฅผ ๋‹ค๋ฅธ ์–ด๋–ค ํŠน์ •ํ•œ ๊ฑธ๋กœ ๋”ฑ ๊ณ ์ •์‹œ์ผœ ๋ฒ„๋ฆฌ๋Š” ๊ฒŒ ๋ฐ”๋กœ bind ๋ผ๊ณ  ํ•œ๋‹ค.

sum.bind(kim);

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ bind ์—๋„ sum ํ•จ์ˆ˜ ๋‚ด๋ถ€์ ์œผ๋กœ this ๋ฅผ ๋ญ˜ ๋กœ ์“ธ ๊ฒƒ์ด๋ƒ์— ๋Œ€ํ•œ ๊ฒƒ์œผ๋กœ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋ฅผ ๋ฐ›์•˜๋‹ค.

์ด์ œ sum ์ด๋ผ๊ณ  ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ๋˜‘๊ฐ™์€๋ฐ ๋‚ด๋ถ€์ ์œผ๋กœ this ๋ฅผ kim ์œผ๋กœ ํ•˜๋Š”

โ€œ์ƒˆ๋กœ์šด ํ•จ์ˆ˜โ€ ๊ฐ€ ๋งŒ๋“ค์–ด ์ง„๋‹ค.

const kimSum = sum.bind(kim, '๐Ÿ”œ')
// call ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋   ๋•Œ ์‚ฌ์šฉํ•  ์ธ์ž๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
kimSum()
;('๐Ÿ”œ30')

sum() ์€ ๋ฐ”๋€Œ์ง€ ์•Š์•˜๋‹ค. ๋‹จ์ง€ sum ์ด ์ทจ์ง€์— ๋งž๊ฒŒ ๋‹ฌ๋ผ์ง„ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด์ ธ์„œ ๋ฆฌํ„ด๋œ ๊ฒƒ์ด๋‹ค.

sum() ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ”œ์š”์•ฝ

call ์€ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ๋•Œ this ์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ฐ”๊พผ๋‹ค.

bind ๋ฅผ ํ†ตํ•ด sum ์€ ์–ด๋–ค ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€์˜ this ๊ฐ’์„ โ€œ์˜๊ตฌ์ โ€ ์œผ๋กœ ๋ฐ”๊พธ๋Š” ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค.

call ๋ฉ”์†Œ๋“œ๋Š” ์ฃผ์–ด์ง„ this ๊ฐ’ ๋ฐ ๊ฐ๊ฐ ์ „๋‹ฌ๋œ ์ธ์ˆ˜์™€ ํ•จ๊ป˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

bind ๋ฉ”์†Œ๋“œ๋Š” ํ˜ธ์ถœ๋˜๋ฉด ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ ,

๋ฐ›๊ฒŒ๋˜๋Š” ์ฒซ ์ธ์ž์˜ value๋กœ๋Š” this keyword๋ฅผ ์„ค์ •ํ•˜๋ฉฐ, ์ด์–ด์ง€๋Š” ์ธ์ž๋“ค์€ ๋ฐ”์ธ๋“œ๋œ ํ•จ์ˆ˜์˜ ์ธ์ˆ˜์— ์ œ๊ณต๋œ๋‹ค.


Written by@[DotoriMook]
ํ”„๋ก ํŠธ์—”๋“œ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž ๋„ํ† ๋ฆฌ๋ฌต์˜ ๊ธฐ์ˆ ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค.

GitHubMediumTwitterFacebook