๐Ÿ“– TIL - this๊ฐ€ ์ €๊ธฐ๋กœ ๊ฐ€๋ฒ„๋ ธ๋„ค?! map ๋ฉ”์„œ๋“œ์™€ this์˜ ์ˆจ๋ฐ”๊ผญ์งˆ

์Š˜ยท2025๋…„ 1์›” 6์ผ

๐Ÿ“– TIL

๋ชฉ๋ก ๋ณด๊ธฐ
17/90

๐Ÿ“Œ ๋ฌธ์ œ ์„ค๋ช…

this์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€๋ฅผ ํ•˜๋‹ค๊ฐ€ this bindingํ•˜๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์ง์ ‘ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด ์ดํ•ด๋ฅผ ํ•ด๋ณด๊ณ ์ž, Array.prototype.map ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณด์•˜๊ณ , ๊ทธ ๊ณผ์ •์—์„œ this ๋ฐ”์ธ๋”ฉ์˜ ์ค‘์š”์„ฑ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.
ํŠนํžˆ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this๊ฐ€ ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

์˜ˆ์‹œ

// map ๋ฉ”์„œ๋“œ ๊ตฌํ˜„
Array.prototype.map = function () {
  var newArr = [];
  console.log(this);  // [1, 2, 3]

  for (var i = 0; i < this.length; i++) {
    console.log(this[i]);
    newArr.push(this[i]);
  }
  return newArr;
};

var newArr = [1, 2, 3].map(function(item) {
  console.log(this);  // [1, 2, 3]
  return item * 2;
});

console.log("result: ", newArr); // [1,2,3] - ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ [2,4,6]์ด ์•„๋‹˜!

๐Ÿค” ๋ฌธ์ œ ์ ‘๊ทผ

  1. map ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ์ด์œ  ๋ถ„์„
  2. this ๋ฐ”์ธ๋”ฉ๊ณผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๊ด€๊ณ„ ํŒŒ์•…
  3. call ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ๋ชจ์ƒ‰

๐Ÿ’ก ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

1. ์ด๋Ÿฐ.. callback์„ ๋„˜๊ธฐ๊ณ  ๋ฐ›์ง€ ์•Š์œผ๋‹ˆ, ์ œ๋Œ€๋กœ ๋™์ž‘ํ• ๋ฆฌ๊ฐ€ ์žˆ๋‚˜..

Array.prototype.map = function (callback) {
  var newArr = [];
  for (var i = 0; i < this.length; i++) {
    newArr.push(this[i]);  // ์–ด๋ผ? callback์€ ์–ด๋””๋กœ..?
  }
  return newArr;
};

2. callback์€ ํ˜ธ์ถœํ–ˆ๋Š”๋ฐ.. this๊ฐ€ ์—‰๋šฑํ•œ ๊ณณ์„ ๊ฐ€๋ฆฌํ‚ค๋„ค?!

Array.prototype.map = function (callback) {
  var newArr = [];
  for (var i = 0; i < this.length; i++) {
    var mappedValue = callback(this[i]);  // this๋Š” ์–ด๋””๋กœ ๊ฐ”์„๊นŒ..
    newArr.push(mappedValue);
  }
  return newArr;
};

3. ์•„ํ•˜! call๋กœ this๋ฅผ ์žก์•„์ฃผ๋‹ˆ ๋“œ๋””์–ด ๋๋‹ค! ๐ŸŽ‰

Array.prototype.map = function (callback, thisArg) {
  var newArr = [];
  for (var i = 0; i < this.length; i++) {
    // thisArg๊ฐ€ ์—†์„ ๊ฒฝ์šฐ this๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , call๋กœ this๋ฅผ ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ!
    var mappedValue = callback.call(thisArg || this, this[i]);
    newArr.push(mappedValue);
  }
  return newArr;
};

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

  1. callback.call(thisArg || this, this[i])

    • call ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ this๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ
    • thisArg๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ํ˜„์žฌ ๋ฐฐ์—ด(this)์„ ๋ฐ”์ธ๋”ฉ
    • ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ค‘์ธ ์š”์†Œ(this[i])๋ฅผ ์ „๋‹ฌ
  2. thisArg์˜ ์—ญํ• 

    • ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  this ๊ฐ’์„ ์ง€์ •
    • ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋จ

โœจ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์šด ์ 

  1. ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด
  2. call/apply/bind ๋ฉ”์„œ๋“œ๋กœ this๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ ๊ฐ€๋Šฅ
  3. Array.prototype์˜ ๋ฉ”์„œ๋“œ๋“ค์€ thisArg ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด this ๋ฐ”์ธ๋”ฉ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿš€ ์ด๋Ÿฐ ์ ์ด ํšจ์œจ์ ์ด์—์š”

  1. call ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ this๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•จ์œผ๋กœ์จ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋™์ž‘ ๋ณด์žฅ
  2. thisArg ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์ œ์–ด ๊ฐ€๋Šฅ

โญ๏ธ ์ฐธ๊ณ  ์ž๋ฃŒ

profile
์ฃผ๋‹ˆ์–ด ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ์žฅ๊ธฐ ๊ธฐ๋ก๊ธฐ๋ก

0๊ฐœ์˜ ๋Œ“๊ธ€