[TIL] 220109

Lee Syong·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
ëŠĨ동ė ėœžëĄœ ė‚īėž, 행ëģĩ하ęēŒðŸ˜

0개ė˜ 댓ęļ€