JavaScript - this(2)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ - this(2)

๋ช…์‹œ์ ์œผ๋กœ this๋ฅผ ๋ฐ”์ธ๋”ฉ ํ•˜๋Š” ๋ฐฉ๋ฒ•

call ๋ฉ”์„œ๋“œ

Function.prototype.call(thisArg[,arg1[,arg2,...]]])
  • ๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ ์ฃผ์ฒด์ธ ํ•จ์ˆ˜๋ฅผ ์ฆ‰์‹œ ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๋ช…๋ น
  • ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋ฅผ this๋กœ ๋ฐ”์ธ๋”ฉํ•˜๊ณ , ์ดํ›„์˜ ์ธ์ž๋“ค์„ ํ˜ธ์ถœํ•  ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•จ
  • call ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ž„์˜์˜ ๊ฐ์ฒด๋ฅผ this๋กœ ์ง€์ • ๊ฐ€๋Šฅ

apply ๋ฉ”์„œ๋“œ

Function.prototype.aplly(thisArg[,argsArray])
  • call ๋ฉ”์„œ๋“œ์™€ ๊ธฐ๋Šฅ์ ์œผ๋กœ ์™„์ „ํžˆ ๋™์ผ
  • ๋‘ ๋ฒˆ์งธ ์ธ์ž๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ›์•„ ๊ทธ ๋ฐฐ์—ด์˜ ์š”์†Œ๋“ค์„ ํ˜ธ์ถœํ•  ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ง€์ •

call / apply ๋ฉ”์„œ๋“œ์˜ ํ™œ์šฉ

์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด์— ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ๋ฅผ ์ ์šฉ

  • ๊ฐ์ฒด์—๋Š” ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ ์ง์ ‘ ์ ์šฉ โŒ
  • ๋‹จ, ํ‚ค๊ฐ€ 0 ๋˜๋Š” ์–‘์˜ ์ •์ˆ˜์ธ ํ”„๋กœํ„ฐํ”ผ๊ฐ€ ์กด์žฌํ•˜๊ณ  length ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด 0 ๋˜๋Š” ์–‘์˜ ์ •์ˆ˜์ธ ๊ฐ์ฒด
    • ๋ฐฐ์—ด์˜ ๊ตฌ์กฐ์™€ ์œ ์‚ฌํ•œ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ(์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด) call ๋˜๋Š” apply ๋ฉ”์„œ๋“œ ์ด์šฉํ•ด ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ ์ฐจ์šฉ ๊ฐ€๋Šฅ
  • push๋ฅผ ๊ฐ์ฒด obj์— ์ ์šฉํ•ด ํ”„๋กœํผํ‹ฐ 3์— โ€˜dโ€™ ์ถ”๊ฐ€
  • call ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ์›๋ณธ์ธ ์œ ์‚ฌ๋ฐฐ์—ด ๊ฐ์ฒด์˜ ์–•์€ ๋ณต์‚ฌ ์ˆ˜ํ–‰
  • slice ๋ฉ”์„œ๋“œ๋ฅผ ์ ์šฉํ•ด ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด๋กœ ์ „ํ™˜
    • ๋ฐฐ์—ด๋ฉ”์„œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์‚ฌ๋ณธ์€ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜

  • ๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ length ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ฝ๊ธฐ ์ „์šฉ์ด๊ธฐ ๋•Œ๋ฌธ์— ์›๋ณธ ๋ฌธ์ž์—ด์— ๋ณ€๊ฒฝ์„ ๊ฐ€ํ•˜๋Š” ๋ฉ”์„œ๋“œ(push,pop,shift,unshift,splice ๋“ฑ)์—๋Š” error๋ฅผ ๋˜์ง

  • concat์ฒ˜๋Ÿผ ๋Œ€์ƒ์ด ๋ฐ˜๋“œ์‹œ ๋ฐฐ์—ด์ด์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์—๋Ÿฌ๋Š” ๋‚˜์ง€ ์•Š์ง€๋งŒ, ์ œ๋Œ€๋กœ ๋œ ๊ฒฐ๊ณผ โŒ

  • ES6์—์„œ๋Š” ์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด ๋˜๋Š” ์ˆœํšŒ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ฐฐ์—ด๋กœ ์ „ํ™˜ํ•˜๋Š” Array.from ๋ฉ”์„œ๋“œ ๋„์ž…

์ƒ์„ฑ์ž ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฅธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ

  • ์ƒ์„ฑ์ž ๋‚ด๋ถ€์— ๋‹ค๋ฅธ ์ƒ์„ฑ์ž์™€ ๊ณตํ†ต๋œ ๋‚ด์šฉ์ด ์žˆ์„ ๊ฒฝ์šฐ
    • call or apply๋ฅผ ์ด์šฉํ•ด ๋‹ค๋ฅธ ์ƒ์„ฑ์‚ฌ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐ˜๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ์Œ

์—ฌ๋Ÿฌ ์ธ์ˆ˜๋ฅผ ๋ฌถ์–ด ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋กœ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ - apply ํ™œ์šฉ

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ๋ฐ›์€ ๋ฉ”์„œ๋“œ์—๊ฒŒ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋กœ ์ธ์ˆ˜๋“ค์„ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ํ™œ์šฉ

  • ES6์—์„œ๋Š” spread operator๋ฅผ ์ด์šฉํ•˜๋ฉด apply๋ณด๋‹ค ๋”์šฑ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ž‘์„ฑ ๊ฐ€๋Šฅ

bind ๋ฉ”์„œ๋“œ

Function.prototype.bind(thisArg[, arg1[,arg2[, ...]]])
  • ES5์— ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ
  • call๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ์ฆ‰์‹œ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ , ๋„˜๊ฒจ ๋ฐ›์€ this ๋ฐ ์ธ์ˆ˜๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋งŒ ํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • ํ•จ์ˆ˜์— this๋ฅผ ๋ฏธ๋ฆฌ ์ ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋ถ€๋ถ„ ์ ์šฉ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ชฉ์ ์„ ์ง€๋‹˜

name ํ”„๋กœํผํ‹ฐ

  • bind ๋ฉ”์„œ๋“œ๋ฅผ ์ ์šฉํ•ด์„œ ์ƒˆ๋กœ ๋งŒ๋“  ํ•จ์ˆ˜๋Š” ํ•œ ๊ฐ€์ง€ ๋…์ฐฉํ•œ ์„ฑ์งˆ์ด ์žˆ์Œ
    • name ํ”„๋กœํผํ‹ฐ์— ๋™์‚ฌ bind์˜ ์ˆ˜๋™ํƒœ์ธ โ€˜boundโ€™๋ผ๋Š” ์ ‘๋‘์–ด๊ฐ€ ๋ถ™๋Š”๋‹ค๋Š” ์ 
  • ์–ด๋–ค ํ•จ์ˆ˜์˜ name ํ”„๋กœํผํ‹ฐ๊ฐ€ โ€˜bound xxxโ€™๋ผ๋ฉด ์ด๋Š” ๊ณง ํ•จ์ˆ˜๋ช…์ด xxx์ธ ์›๋ณธ ํ•จ์ˆ˜์— bind ๋ฉ”์„œ๋“œ๊ฐ€ ์ ์šฉํ•œ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ผ๋Š” ์˜๋ฏธ
  • ๊ธฐ์กด์˜ call or apply๋ณด๋‹ค ์ฝ”๋“œ ์ถ”์ ์ด ์ˆ˜์›”ํ•จ

์ƒ์œ„ ์ปจํ…์ŠคํŠธ์˜ this๋ฅผ ๋‚ด๋ถ€ํ•จ์ˆ˜๋‚˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๊ธฐ

  • call or apply or bind ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฉ”์„œ๋“œ์˜ ๋‚ด๋ถ€ํ•จ์ˆ˜์—์„œ ๋ฉ”์„œ๋“œ์˜ this๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ”๋ผ๋ณด๊ฒŒ ํ•˜๊ธฐ ๊ฐ€๋Šฅ

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด์—์„œ์˜ this์— ๊ด€์—ฌํ•˜๋Š” ํ•จ์ˆ˜ ๋˜๋Š” ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด์„œ๋„ bind ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด this๊ฐ’์„ ์‚ฌ์šฉ์ž์˜ ์ž…๋ง›์— ๋งž๊ฒŒ ์ˆ˜์ • ๊ฐ€๋Šฅ

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์˜ ์˜ˆ์™ธ์‚ฌํ•ญ

  • ES6์— ์ƒˆ๋กญ๊ฒŒ ๋„์ž…๋œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ ์‹œ, this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๊ณผ์ • โŒ
  • ํ•จ์ˆ˜ ๋‚ด๋ถ€์— this๊ฐ€ ์•„์˜ˆ ์—†์œผ๋ฉฐ, ์ ‘๊ทผํ•˜๊ณ ์ž ํ•˜๋ฉด ์Šค์ฝ”ํ”„์ฒด์ธ์ƒ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด this์— ์ ‘๊ทผ

  • ๋ณ„๋„์˜ ๋ณ€์ˆ˜๋กœ this๋ฅผ ์šฐํšŒํ•  ํ•„์š” โŒ
  • call/apply/bind ์ ์šฉํ•  ํ•„์š” โŒ , ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ณ  ํŽธ๋ฆฌ

๋ณ„๋„์˜ ์ธ์ž๋กœ this๋ฅผ ๋ฐ›๋Š” ๊ฒฝ์šฐ(์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด์—์„œ์˜ this)

  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ ์ค‘ ์ผ๋ถ€๋Š” ์ถ”๊ฐ€๋กœ this๋กœ ์ง€์ •ํ•  ๊ฐ์ฒด(thisArg)๋ฅผ ์ธ์ž๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ โญ•๏ธ
  • ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ์˜ thisArg ๊ฐ’์„ ์ง€์ •ํ•˜๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this ๊ฐ’์„ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
  • ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ์— ๋งŽ์ด ํฌ์ง„
  • ES6์— ์ƒˆ๋กœ ๋“ฑ์žฅํ•œ set,map ๋“ฑ์˜ ๋ฉ”์„œ๋“œ์—๋„ ์ผ๋ถ€ ์กด์žฌ / ๊ทธ ์ค‘ ๋Œ€ํ‘œ์ ์ธ ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ์ธ forEach

์ฝœ๋ฐฑํ•จ์ˆ˜์™€ ํ•จ๊ป˜ thisArg๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ

Array.prototype.forEach(callback[,thisArg])
Array.prototype.map(callback[,thisArg])
Array.prototype.filter(callback[,thisArg])
Array.prototype.some(callback[,thisArg])
Array.prototype.every(callback[,thisArg])
Array.prototype.find(callback[,thisArg])
Array.prototype.findIndex(callback[,thisArg])
Array.prototype.flatMap(callback[,thisArg])
Array.prototype.from(arrayLike[,(callback[,thisArg]])
set.prototype.forEach(callback[,thisArg])
Map.prototype.forEach(callback[,thisArg])

์ฐธ๊ณ  : ์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(Core JavaScript), ์ •์žฌ๋‚จ