[TIL] 220109

dev·2022년 1ė›” 9ėž
0

TIL

ëŠĐ록 ëģīęļ°
144/204
post-thumbnail

📝 ė˜Ī늘 한 ęēƒ

  1. ė―œë°ą í•Ļ눘

📚 ë°°ėšī ęēƒ

4. ė―œë°ą í•Ļ눘

1) ė―œë°ą í•Ļėˆ˜ëž€?

ė―œë°ą í•Ļėˆ˜ëŠ” ë‹ĪëĨļ ė―”ë“œė˜ ėļėžëĄœ 넘ęēĻėĢžëŠ” í•Ļ눘ëĨž 말한ë‹Ī.

2) 렜ė–īęķŒ

(1) í˜ļėķœ ė‹œė 

var count = 0;
var cbFunc = function () {
  console.log(count);
  if (++count > 4) clearInterval(timer);
};
var timer = setInterval(cbFunc, 300);

ė―œë°ą í•Ļ눘(cbFunc)ė˜ 렜ė–īęķŒė„ 넘ęēĻë°›ė€ í•Ļ눘(setInterval)는 ė―œë°ą í•Ļ눘 í˜ļėķœ ė‹œė ė— 대한 렜ė–īęķŒė„ 氀맄ë‹Ī.
→ setInterval í•Ļėˆ˜ę°€ 0.3ėīˆ ë’Ī cbFunc í•Ļ눘 í˜ļėķœ

(2) ėļėž

ė―œë°ą í•Ļ눘ëĨž í˜ļėķœí•˜ëŠ” ėĢžėēī는 ė‚ŽėšĐėžę°€ ė•„ë‹ˆëž ę·ļ ė―œë°ą í•Ļėˆ˜ė˜ 렜ė–īęķŒė„ 넘ęēĻë°›ė€ í•Ļ눘ėīë‹Ī.
ë”°ëžė„œ, ė―œë°ą í•Ļ눘ëĨž í˜ļėķœí•  때 ėļėžė— ė–īë–Ī 값ë“Īė„ ė–īë–Ī ėˆœė„œëĄœ 넘ęļļ ęēƒėļ가는 ė „ė ėœžëĄœ ę·ļ ė―œë°ą í•Ļėˆ˜ė˜ 렜ė–īęķŒė„ 넘ęēĻë°›ė€ í•Ļėˆ˜ė—ęēŒ ë‹ŽëͰ ęēƒėīëŊ€ëĄœ ė‚ŽėšĐėžę°€ ėž„ė˜ëĄœ ëģ€ęē―할 눘 ė—†ë‹Ī.

(3) this

ė―œë°ą í•Ļėˆ˜ë„ í•Ļ눘ėīęļ° ë•ŒëŽļ뗐 ęļ°ëģļė ėœžëĄœëŠ” this가 ė „ė—­ 객ėēīëĨž ė°ļėĄ°í•˜ė§€ë§Œ, 렜ė–īęķŒė„ 넘ęēĻë°›ė„ ė―”ë“œė—ė„œ ė―œë°ą í•Ļėˆ˜ė— ëģ„ë„ëĄœ this가 될 ëŒ€ėƒė„ ė§€ė •í•œ ęē―ėš°ė—ëŠ”, ę·ļ ëŒ€ėƒė„ ė°ļėĄ°í•˜ęēŒ ëœë‹Ī.

í›„ėžė˜ ęē―뚰, ė―œë°ą í•Ļėˆ˜ė˜ 렜ė–īęķŒė„ 넘ęēĻë°›ė„ ė―”ë“œëŠ” 'ėžėēīė ėœžëĄœ' call/apply ëĐ”ė„œë“œė˜ ėēŦ ëēˆė§ļ ėļėžė— ė―œë°ą í•Ļ눘 ë‚īëķ€ė—ė„œė˜ this가 될 ëŒ€ėƒė„ ëŠ…ė‹œė ėœžëĄœ 바ėļë”Đ한ë‹Ī.

ė˜ˆëĄœėĻ map ëĐ”ė„œë“œëĨž 간ë‹Ļ히 ęĩŽí˜„하ëĐī ë‹ĪėŒęģž ę°™ë‹Ī.
map ëĐ”ė„œë“œ ėžėēīė ėœžëĄœ call(thisArg || window)ëĨž í†ĩí•ī thisArg 값ėī ėžˆė„ ęē―뚰 thisëĨž 바ėļë”Đ하ęģ  ėžˆėŒė„ ė•Œ 눘 ėžˆë‹Ī.

Array.prototype.map = function (callback, thisArg) {
  var mappedArr = [];
  for (var i = 0; i < this.length; i++) {
    var mappedValue = callback.call(thisArg || window, this[i], i, this);
    mappedArr[i] = mappedValue;
  }
  return mappedArr;
}

ë‹ĪëĨļ ė˜ˆëĄœ addEventListener는 ė―œë°ą í•Ļ눘ëĨž í˜ļėķœí•  때 ė•„ė˜ˆ call ëĐ”ė„œë“œė˜ ėēŦ ëēˆė§ļ ėļėžė— addEventListener ëĐ”ė„œë“œė˜ thisëĨž ę·ļ대로 넘ęēĻėĢžë„ëĄ ėžėēīė ėœžëĄœ ė •ė˜ë˜ė–ī ėžˆë‹Ī.

3) ė―œë°ą í•Ļėˆ˜ëŠ” í•Ļ눘ë‹Ī

ė―œë°ą í•Ļėˆ˜ëĄœ ė–īë–Ī 객ėēīė˜ ëĐ”ė„œë“œëĨž ė „ë‹Ží•˜ë”ëžë„ ę·ļ ëĐ”ė„œë“œëŠ” ëĐ”ė„œë“œę°€ ė•„ë‹ˆëž í•Ļėˆ˜ëĄœė„œ í˜ļėķœëœë‹Ī.
ė͉, ė―œë°ą í•Ļėˆ˜ëĄœ 객ėēīė˜ ëĐ”ė„œë“œëĨž ė „ë‹Ží•œ ęē―ėš°ë”ëžë„ ė―œë°ą í•Ļėˆ˜ė˜ this는 í•īë‹đ 객ėēī가 ė•„ë‹ˆëž ė „ė—­ 氜ėēīëĨž 가ëĶŽí‚ĪęēŒ ëœë‹Ī.


4) ė―œë°ą í•Ļ눘 ë‚īëķ€ė˜ this뗐 ë‹ĪëĨļ 값 바ėļë”Đ하ęļ°

ę·ļëŸžė—ë„ ëķˆęĩŽí•˜ęģ  ė―œë°ą í•Ļ눘 ë‚īëķ€ė—ė„œ this가 ė „ė—­ 객ėēī가 ė•„ë‹ˆëž í•īë‹đ 객ėēīëĨž 가ëĶŽí‚Ī도록 하ë ĪëĐī ė–īë–ŧęēŒ í•īė•ž 할ęđŒ?
mapėī나 forEach ėē˜ëŸž ëģ„ë„ė˜ ėļėžëĄœ thisëĨž 받는 í•Ļėˆ˜ė˜ ęē―ėš°ė—ëŠ” ė—Žęļ°ė— ė›í•˜ëŠ” ę°’ė„ 넘ęēĻėĢžëĐī ë˜ė§€ë§Œ, ę·ļë ‡ė§€ ė•Šė€ ęē―ėš°ė—ëŠ” ė―œë°ą í•Ļėˆ˜ė˜ 렜ė–īęķŒė„ 넘ęēĻėĢžëŠ” í•Ļėˆ˜ė— thisė˜ 렜ė–īęķŒë„ í•Ļęŧ˜ 넘ęēĻėĢžęēŒ ë˜ëŊ€ëĄœ ė‚ŽėšĐėžę°€ ėž„ė˜ëĄœ ę°’ė„ 바ęŋ€ 눘 ė—†ėœžëŊ€ëĄœ ë‹ĪëĨļ ë°Đëē•ė„ ė‚ŽėšĐí•īė•ž 한ë‹Ī.
ė―œë°ą í•Ļ눘 ë‚īëķ€ė˜ this뗐 ë‹ĪëĨļ ę°’ė„ 바ėļë”Đ하ęļ° ėœ„í•œ 4氀맀 ë°Đëē•ėī ėžˆë‹Ī.

(1) thisëĨž ë‹ĪëĨļ ëģ€ėˆ˜ė— 할ë‹đ

ė „í†ĩė ėœžëĄœëŠ” thisëĨž ë‹ĪëĨļ ëģ€ėˆ˜ė— ë‹īė•„ ė―œë°ą í•Ļėˆ˜ëĄœ 활ėšĐ할 í•Ļėˆ˜ė—ė„œ this ëŒ€ė‹  ę·ļ ëģ€ėˆ˜ëĨž ė‚ŽėšĐ하도록 했ë‹Ī.

var obj1 = {
  name: "obj1".
  func: function () {
    var self = this; // thisëĨž ë‹ĪëĨļ ëģ€ėˆ˜ė— 할ë‹đ
    return function () {
      console.log(self.name); // ė―œë°ą í•Ļėˆ˜ė—ė„œ ę·ļ ëģ€ėˆ˜ëĨž ė‚ŽėšĐ
    };
  }
};

var callback = obj1.func();
setTimeout(callback, 1000);

(2) this ëŒ€ė‹  í•īë‹đ 객ėēī ė‚ŽėšĐ

var obj1 = {
  name: "obj1",
  func: function () {
    console.log(obj1.name);
  }
};

setTimeout(obj1.func, 1000);

(1)ëģīë‹Ī í›Ļė”Ž 링ęī€ė ėīęģ  ę°„ęē°í•˜ė§€ë§Œ, ėī렇ęēŒ ėž‘ė„ąí•˜ëĐī 가ëĶŽí‚Ž 객ėēī가 obj1ėœžëĄœ ęģ ė •ėī 되ė–ī ë‹Īė–‘í•œ 냁í™Đė—ė„œ ėžŽí™œėšĐ할 눘 ė—†ë‹Ī.

(3) (1)ė˜ func í•Ļ눘 ėžŽí™œėšĐ

var obj1 = {
  name: "obj1",
  func: function () {
    var self = this; // 2. ė—Žęļ°ė„œ this도 obj2
    return function () {
      console.log(self.name); // obj2
    };
  }
};

var obj2 = {
  name: "obj2",
  func: obj1.func,
};
var callback2 = obj2.func(); // 1. ė—Žęļ°ė„œ func ëĐ”ė„œë“œ ë‚īëķ€ė—ė„œė˜ this는 obj2ėīëŊ€ëĄœ
setTimeout(callback2, 1500);

var obj3 = { name: "obj3" };
var callback3 = obj1.func.call(obj3); // call ëĐ”ė„œë“œëŠ” í˜ļėķœ ėĢžėēī í•Ļ눘(obj1.func)ëĨž ėĶ‰ė‹œ ė‹Ī행
setTimeout(callback3, 1500);

ëēˆęą°ëĄ­ęļī í•˜ė§€ë§Œ thisëĨž ėš°íšŒė ėœžëĄœë‚˜ë§ˆ 활ėšĐí•ĻėœžëĄœėĻ ë‹Īė–‘í•œ 냁í™Đė—ė„œ ė›í•˜ëŠ” 객ėēīëĨž 바띾ëģī는 ė―œë°ą í•Ļ눘ëĨž 만ë“Ī 눘 ėžˆë‹Ī.

(4) bind ëĐ”ė„œë“œ 활ėšĐ

bind ëĐ”ė„œë“œëŠ” call ëĐ”ė„œë“œė™€ 닮ëĶŽ í˜ļėķœ ėĢžėēī í•Ļ눘ëĨž ėĶ‰ė‹œ ė‹Īí–‰ė‹œí‚Īė§€ ė•Šęģ  ėƒˆëĄœėšī í•Ļ눘ëĨž 반환하ęļ° ë•ŒëŽļ뗐 ęĩģėī obj1.funcė—ė„œ setTimeoutė˜ ė―œë°ą í•Ļėˆ˜ëĄœ 활ėšĐ할 í•Ļ눘ëĨž 따로 return í•īėĢžė§€ ė•Šė•„ë„ 된ë‹Ī.

var obj1 = {
  name: "obj1",
  func: function () {
    console.log(this.name);
  }
};

var obj2 = { name: "obj2" };
setTimeout(obj1.func.bind(obj2), 1500);

5) ė―œë°ą ė§€ė˜Ĩęģž ëđ„동ęļ° ė œė–ī

(1) ė―œë°ą ė§€ė˜Ĩ, ëđ„동ęļ°ė ėļ ė―”ë“œ

ė―œë°ą ė§€ė˜Ĩėī란 ė―œë°ą í•Ļ눘ëĨž ėĩ멅 í•Ļėˆ˜ëĄœ ė „ë‹Ží•˜ëŠ” ęģžė •ėī 반ëģĩ되ė–ī ė―”ë“œė˜ ë“Īė—Žė“°ęļ° ėˆ˜ėĪ€ėī 감ë‹đ하ęļ° íž˜ë“Ī ė •ë„ëĄœ ęđŠė–īė§€ëŠ” í˜„ėƒė„ 말한ë‹Ī.
ėī는 ėĢžëĄœ ëđ„동ęļ°ė ėļ ėž‘ė—…ė„ ėˆ˜í–‰í•  때 ėžėĢž ë°œėƒí•˜ëŠ” ëŽļ렜ėīë‹Ī.

ëđ„동ęļ°ė ėļ ė―”ë“œëž€ í˜„ėžŽ ė‹Ī행 ėĪ‘ėļ ė―”ë“œė˜ 뙄ë̌ ė—Žëķ€ė™€ ëŽīęī€í•˜ęēŒ ėĶ‰ė‹œ ë‹ĪėŒ ė―”ë“œëĄœ 넘ė–ī가는 ė―”ë“œëĨž 말한ë‹Ī.
ë”°ëžė„œ, ëđ„동ęļ°ė ėļ ė―”ë“œëŠ” (ė„Īë đ ėž‘ė—…ė„ 뙄ëĢŒí•˜ëŠ” 데 ė‹œę°„ėī 많ėī í•„ėš”í•˜ë”ëžë„) ėš”ėē­ęģž ęē°ęģžę°€ ë™ė‹œė— ėžė–ī나는 동ęļ°ė ėļ ė―”ë“œė™€ 닮ëĶŽ, ėš”ėē­ęģž ęē°ęģžę°€ ë™ė‹œė— ėžė–īë‚˜ė§€ ė•ŠëŠ”ë‹Ī.
ëģ„ë„ė˜ ėš”ėē­(fetch, XMLHttpRequest), ė‹Ī행 대ęļ°(addEventListener), ëģīëĨ˜(setTimeout) 등ęģž ęī€ë Ļ된 ė―”ë“œę°€ ëđ„동ęļ°ė ėļ ė―”ë“œėīë‹Ī.

(2) ė―œë°ą ė§€ė˜Ĩ í•īęē° ðŸ”Ĩ

ė―œë°ą ė§€ė˜Ĩė„ í•īęē°í•˜ëŠ” 가ėžĨ 간ë‹Ļ한 ë°Đëē•ė€ ėĩëŠ…ė˜ ė―œë°ą í•Ļ눘ëĨž ęļ°ëŠ… í•Ļėˆ˜ëĄœ ė „í™˜í•˜ëŠ” ęēƒėīë‹Ī.

ë‹ĪëĨļ ë°Đëē•ėœžëĄœ ëđ„동ęļ° ėž‘ė—…ė„ 동ęļ°ė ėœžëĄœ í˜đė€ 동ęļ°ė ėļ ęēƒėē˜ëŸž ëģīėīęēŒë” ėē˜ëĶŽí•īėĪ„ ėˆ˜ë„ ėžˆë‹Ī.
ėīëĨž ėœ„í•ī ES6ė—ė„œ Promise뙀 Generator가 ë„ėž…ë˜ė—ˆęģ , ES2017ė—ė„œëŠ” async/awaitėī ë„ėž…ë˜ė—ˆë‹Ī.

[TIL] 211012 (promise / async) / [TIL] 211013 (await) ė°ļęģ 

Promise

new ė—°ė‚°ėžė™€ í•Ļęŧ˜ í˜ļėķœí•œ Promiseė˜ ėļėžëĄœ 넘ęēĻėĢžëŠ” ė―œë°ą í•Ļ눘(ė‹Ī행 í•Ļ눘)는 í˜ļėķœí•  때 바로 ė‹Īí–‰ë˜ė§€ë§Œ, ę·ļ ë‚īëķ€ė— resolve 또는 reject í•Ļ눘ëĨž í˜ļėķœí•˜ëŠ” ęĩŽëŽļėī ėžˆė„ ęē―뚰 둘 ėĪ‘ 하나가 ė‹Ī행되ęļ° ė „ęđŒė§€ëŠ” ë‹ĪėŒ(then) 또는 ė˜ĪëĨ˜ ęĩŽëŽļ(catch)로 넘ė–ī氀맀 ė•ŠëŠ”ë‹Ī.
ë”°ëžė„œ, ëđ„동ęļ° ėž‘ė—…ėī 뙄ëĢŒë  때, ëđ„ëĄœė†Œ resolve 또는 rejectëĨž í˜ļėķœí•˜ëŠ” ë°Đëē•ėœžëĄœ ëđ„동ęļ° ėž‘ė—…ė˜ 동ęļ°ė  표현ėī 가ëŠĨ하ë‹Ī.

Generator

ëđ„동ęļ° ėž‘ė—…ėī 뙄ëĢŒë˜ëŠ” ė‹œė ë§ˆë‹Ī next ëĐ”ė„œë“œëĨž í˜ļėķœí•ĻėœžëĄœėĻ Generator í•Ļ눘 ë‚īëķ€ė˜ ė†ŒėŠĪ가 ėœ„ė—ė„œëķ€í„° ė•„ëž˜ëĄœ 눜ė°Ļė ėœžëĄœ ė§„í–‰ë˜ë„ëĄ 할 눘 ėžˆë‹Ī.

Promise + Async/await

var addCoffee = function (name) {
  return new Promise(function (resolve) {
    setTimeout(function () {
      resolve(name);
    }, 500);
  });
};

var coffeeMaker = async function () {
  var coffeeList = "";
  var _addCoffee = async function (name) {
    coffeeList += (coffeeList ? "," : "") + await addCoffee(name);
  };
  await _addCoffee("뗐ėŠĪí”„ë ˆė†Œ");
  console.log(coffeeList);
  await _addCoffee("ė•„ëДëĶŽėđīë…ļ");
  console.log(coffeeList);
  await _addCoffee("ėđī페ëŠĻėđī");
  console.log(coffeeList);
  await _addCoffee("ėđī페띾떾");
  console.log(coffeeList);
};

coffeeMaker();

ëđ„동ęļ° ėž‘ė—…ė„ ėˆ˜í–‰í•˜ęģ ėž 하는 í•Ļ눘 ė•žė— asyncëĨž 표현하ęģ , í•Ļ눘 ë‚īëķ€ė—ė„œ ė‹Ī마렁ėļ ëđ„동ęļ° ėž‘ė—…ėī í•„ėš”í•œ ėœ„ėđ˜ë§ˆë‹Ī awaitė„ 표ęļ°í•œë‹Ī.
Promise가 await뗐 넘ęēĻė§€ëĐī, awaitė€ Promise가 fulfill 되ęļ°ëĨž ęļ°ë‹Īë ļë‹Ī가, í•īë‹đ ę°’ė„ return 한ë‹Ī.
ėīëĨž í†ĩí•ī promiseė˜ thenęģž íĄė‚Ží•œ íšĻęģžëĨž ė–ŧė„ 눘 ėžˆë‹Ī.

coffeeMaker()
await _addCoffee("뗐ėŠĪí”„ë ˆė†Œ")
await addCoffee("뗐ėŠĪí”„ë ˆė†Œ")
0.5ėīˆ ë’Ī뗐 "뗐ėŠĪí”„ë ˆė†Œ" ę°’ė„ ë‹īė€ resolve í•Ļ눘 í˜ļėķœ ( = promise ėƒíƒœ fullfilled)
_addCoffee í•Ļėˆ˜ė˜ await addCoffee("뗐ėŠĪí”„ë ˆė†Œ")가 "뗐ėŠĪí”„ë ˆė†Œ"ëĨž return


âœĻ ë‚īėž 할 ęēƒ

  1. íīëĄœė €
profile
dev log

0ę°œė˜ 댓ęļ€