[TIL] 220110

leesyong·2022년 1ė›” 10ėž
0

TIL

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

📝 ė˜Ī늘 한 ęēƒ

  1. íīëĄœė €

📖 학ėŠĩ ėžë̌

  1. ėą… ã€Žė―”ė–ī ėžë°”ėŠĪ큎ëĶ―íŠļ』

📚 ë°°ėšī ęēƒ

5. íīëĄœė €

[TIL] 210915 ė°ļęģ 

1) íīëĄœė €ė˜ ė˜ëŊļ 및 뛐ëĶŽ ėīí•ī

íīëĄœė €ëž€ í•Ļėˆ˜ė™€ ę·ļ í•Ļėˆ˜ę°€ ė„ ė–ļ될 ë‹đė‹œė˜ LexicalEnvironmentė˜ 냁í˜ļęī€ęģ„뗐 따ëĨļ í˜„ėƒė„ 말한ë‹Ī.
ë‹ĪëĨļ 말로는, ė–īë–Ī í•Ļėˆ˜ė—ė„œ ė„ ė–ļ한 ëģ€ėˆ˜ëĨž ė°ļėĄ°í•˜ëŠ” ë‚īëķ€ í•Ļėˆ˜ė—ė„œë§Œ ë°œėƒí•˜ëŠ” í˜„ėƒėī띞ęģ  í•  눘 ėžˆë‹Ī.

ėīí•ī하ęļ° ė–īë ĩęļ° ë•ŒëŽļ뗐 ė„ĪëŠ…ė„ 덧ëķ™ėīėžëĐī ë‹ĪėŒęģž ę°™ë‹Ī.

var outer = function () {
  var a = 1;
  var inner = function () {
    console.log(++a);
  };
  return inner();
};

var outer2 = outer();
consol.elog(outer2);

ėœ„ ė˜ˆė œëŠ” ėžë°˜ė ėļ í•Ļ눘 및 ë‚īëķ€ í•Ļėˆ˜ė—ė„œė˜ ë™ėž‘ė„ ëģīė—ŽėĪ€ë‹Ī.
ėžë°˜ė ėœžëĄœ outer ė‹Ī행 ėŧĻ텍ėŠĪíŠļ가 ėĒ…ëĢŒë˜ëĐī LexicalEnvironment뗐 ė €ėžĨ된 ė‹ëģ„ėžë“Ī(a, inner)뗐 대한 ė°ļėĄ°ëĨž ė§€ėšīë‹Ī.
ę·ļ럮ëĐī 각 ėĢžė†Œė— ė €ėžĨ되ė–ī ėžˆë˜ 데ėī터 ė˜ė—­ė˜ 값ë“Īė€ ėžė‹ ė„ ė°ļėĄ°í•˜ëŠ” ëģ€ėˆ˜ę°€ 하나도 ė—†ęēŒ ë˜ëŊ€ëĄœ 가ëđ„ė§€ ėŧŽë ‰í„°ė˜ ėˆ˜ė§‘ ëŒ€ėƒėī 된ë‹Ī.
ėī ęē―뚰 outer í•Ļėˆ˜ė˜ ė‹Ī행 ėŧĻ텍ėŠĪíŠļ가 ėĒ…ëĢŒë˜ęļ° ė „ė— inner í•Ļėˆ˜ė˜ ėŧĻ텍ėŠĪíŠļ가 ėĒ…ëĢŒë˜ęģ , ėīí›„ė— ëģ„ë„ëĄœ inner í•Ļ눘ëĨž í˜ļėķœí•  ėˆ˜ë„ ė—†ë‹Ī.

var outer = function () {
  var a = 1;
  var inner = function () {
    return ++a;
  };
  return inner;
};

var outer2 = outer();
console.log(outer2());
console.log(outer2());

반ëĐī뗐, ėœ„ ė˜ˆė œëŠ” ëŒ€í‘œė ėļ íīëĄœė €ė˜ ė˜ˆė‹œėīë‹Ī.
ėī ęē―뚰 outer í•Ļėˆ˜ę°€ inner í•Ļ눘ëĨž 반환하ęģ  ėžˆęļ° ë•ŒëŽļ뗐 outer í•Ļėˆ˜ė˜ ė‹Ī행 ėŧĻ텍ėŠĪíŠļ가 ėĒ…ëĢŒëœ í›„ė—ë„ inner í•Ļ눘ëĨž í˜ļėķœí•  눘 ėžˆë‹Ī.

outer2()뗐 ė˜í•ī inner í•Ļėˆ˜ę°€ í˜ļėķœë˜ëŠ”ë° inner í•Ļėˆ˜ëŠ” ëģ€ėˆ˜ aė˜ ę°’ė„ ė°ļėĄ°í•˜ęģ  ėžˆë‹Ī.
LexicalEnvironmentė˜ environmentRecord뙀 outerEnvironmentReference뗐 ė˜í•ī ëģ€ėˆ˜ė˜ 뜠íšĻëē”ėœ„ėļ ėŠĪė―”í”„ę°€ ęē°ė •되ęģ  ėŠĪė―”í”„ ėēīėļėī 가ëŠĨí•īė§„ë‹Ī.
ę·ļ런데 inner í•Ļėˆ˜ė˜ ė‹Ī행 ėŧĻ텍ėŠĪíŠļė˜ environmentRecordė—ė„œëŠ” ëģ€ėˆ˜ aëĨž ė°ūė„ 눘 ė—†ėœžëŊ€ëĄœ outerEnvironmentReferenceė—ė„œ ė°ūė•„ė•ž 한ë‹Ī.
inner í•Ļėˆ˜ė˜ ė‹Ī행 ėŧĻ텍ėŠĪíŠļė˜ outerEnvironmentReferenceė—ëŠ” inner í•Ļėˆ˜ę°€ ė„ ė–ļ될 ë‹đė‹œė˜ LexicalEnvironmentėļ outer í•Ļėˆ˜ė˜ ė‹Ī행 ėŧĻ텍ėŠĪíŠļė˜ LexicalEnvironment가 ë‹īęļīë‹Ī.
ėŠĪė―”í”„ ėēīėīë‹ė— 따띾 outer í•Ļėˆ˜ė—ė„œ ė„ ė–ļ한 ëģ€ėˆ˜ a뗐 ė ‘ę·ží•  눘 ėžˆęēŒ ë˜ė–ī console ė°―ė—ëŠ” 각각 2뙀 3ėī띾는 값ėī ėķœë Ĩ된ë‹Ī.

ę·ļ런데 inner í•Ļėˆ˜ė˜ ė‹Ī행 ė‹œė ė—ëŠ” outer í•Ļėˆ˜ëŠ” ėīëŊļ ė‹Ī행ėī ėĒ…ëĢŒëœ ėƒíƒœėž„ė—ë„ ė–īë–ŧęēŒ outer í•Ļėˆ˜ė˜ LexicalEnvironment뗐 ė ‘ę·ží•  눘 ėžˆëŠ” ęąļęđŒ?
ėī는 ė–īë–Ī ę°’ė„ ė°ļėĄ°í•˜ëŠ” ëģ€ėˆ˜ę°€ 하나띾도 ėžˆë‹ĪëĐī ę·ļ ę°’ė€ ėˆ˜ė§‘ ëŒ€ėƒė— 폎í•Ļė‹œí‚Īė§€ ė•ŠëŠ” 가ëđ„ė§€ ėŧŽë ‰í„°ė˜ ë™ėž‘ ë°Đė‹ 때ëŽļėīë‹Ī.
ė͉, ėœ„ ė˜ˆė œė˜ ęē―뚰 inner í•Ļėˆ˜ę°€ ė™ļëķ€ëĄœ ė „ë‹Žë˜ė–ī(outer2 ëģ€ėˆ˜ëĄœ ė „ë‹Ž) ė–ļė œë“  outer2()뗐 ė˜í•ī inner í•Ļėˆ˜ę°€ í˜ļėķœë  ė—Žė§€ę°€ ėžˆëŠ” 냁í™Đė—ė„œ inner í•Ļėˆ˜ëŠ” ëģ€ėˆ˜ aëĨž ė°ļėĄ°í•˜ęģ  ėžˆęļ° ë•ŒëŽļ뗐 inner í•Ļ눘ëĨž return 하ëĐīė„œ outer í•Ļėˆ˜ė˜ ė‹Ī행 ėŧĻ텍ėŠĪíŠļ가 ėĒ…ëĢŒë˜ė—ˆėŒė—ë„ ëģ€ėˆ˜ a가 가ëđ„ė§€ ėŧŽë ‰íŒ…ë˜ė§€ ė•ŠëŠ” ęēƒėīë‹Ī.

ėīëĨž ë°”íƒ•ėœžëĄœ íīëĄœė €ė˜ ė •ė˜ëĨž ë‹Īė‹œ ė‰―ęēŒ í’€ė–īė“°ëĐī ë‹ĪėŒęģž ę°™ë‹Ī.
íīëĄœė €ëž€ ė™ļëķ€ í•Ļėˆ˜ė˜ 맀뗭ëģ€ėˆ˜ëĨž ė°ļėĄ°í•˜ëŠ” ë‚īëķ€ í•Ļėˆ˜ę°€ ė™ļëķ€ëĄœ ė „ë‹Žëœ ęē―뚰, ė™ļëķ€ í•Ļėˆ˜ė˜ ė‹Ī행 ėŧĻ텍ėŠĪíŠļ가 ėĒ…ëĢŒëœ ėīí›„ė—ë„ ė™ļëķ€ í•Ļėˆ˜ė˜ ëģ€ėˆ˜ a가 ė‚Žëžė§€ė§€ ė•ŠëŠ”(가ëđ„ė§€ ėŧŽë ‰íŒ…ë˜ė§€ ė•ŠëŠ”) í˜„ėƒė„ 말한ë‹Ī. (ėī때, ė™ļëķ€ í•Ļ눘 ≠ ė™ļëķ€)

ėœ„ 똈렜ëĨž ëđ—대ė–ī ë‹ĪėŒęģž ę°™ėī ė„Ī멅할 눘 ėžˆë‹Ī.
íīëĄœė €ëž€ ė™ļëķ€ í•Ļ눘(outer)ė˜ 맀뗭ëģ€ėˆ˜(a)ëĨž ė°ļėĄ°í•˜ëŠ” ë‚īëķ€ í•Ļ눘(inner)가 ė™ļëķ€ëĄœ ė „ë‹Ž(return inner → outer2 ëģ€ėˆ˜ė— 할ë‹đ)된 ęē―뚰, ė™ļëķ€ í•Ļėˆ˜ė˜ ė‹Ī행 ėŧĻ텍ėŠĪíŠļ가 ėĒ…ëĢŒëœ ėīí›„ė—ë„(inner í•Ļ눘ëĨž return 하ëа ėĒ…ë̌) ė™ļëķ€ í•Ļėˆ˜ė˜ ëģ€ėˆ˜ a가 ė‚Žëžė§€ė§€ ė•ŠëŠ” í˜„ėƒė„ 말한ë‹Ī.

한íŽļ, ë‚īëķ€ í•Ļ눘ëĨž return 하는 ęēƒ ė™ļė—ë„ ë‚īëķ€ í•Ļ눘ëĨž ė―œë°ą í•Ļėˆ˜ëĄœ ė‚ŽėšĐí•˜ė—Ž ė™ļëķ€ė— ė „ë‹Ží•  ėˆ˜ë„ ėžˆë‹Ī.
ë‚īëķ€ í•Ļ눘ëĨž ė―œë°ą í•Ļėˆ˜ëĄœ ė‚ŽėšĐ하ëĐīė„œ ė™ļëķ€ëĄœ ė „ë‹Ží•˜ëŠ” ëŒ€í‘œė ėļ ė˜ˆëĄœëŠ” setInterval/setTimeoutęģž addEventListenerëĨž ë“Ī 눘 ėžˆë‹Ī.
ėī ęē―뚰 returnėī ė—†ė–ī도 íīëĄœė €ę°€ ë°œėƒí•œë‹Ī.

// setInterval
(function () {
  var a = 0;
  var intervalId = null;
  var inner = function () {
    if (++a >= 10) {
      clearInterval(intervalId);
    }
    console.log(a);
  };
  intervalId = setInterval(inner, 1000);
})();

setInterval í•Ļėˆ˜ę°€ ė‹Ī행ëĻ뗐 따띾 (ėĶ‰ė‹œ ė‹Ī행 í•Ļėˆ˜ëĄœ 표현된) ėĩ멅 í•Ļėˆ˜ė˜ ė‹Ī행ėī 뙄ëĢŒë˜ė–ī ėĩ멅 í•Ļėˆ˜ė˜ ė‹Ī행 ėŧĻ텍ėŠĪíŠļ가 ėĒ…ëĢŒëœë‹Ī.
ę·ļ럮나, ėĩ멅 í•Ļėˆ˜ė—ė„œ ė„ ė–ļ된 ëģ€ėˆ˜ aëĨž ė°ļėĄ°í•˜ëŠ” inner í•Ļėˆ˜ę°€ setInterval í•Ļėˆ˜ė˜ ė―œë°ą í•Ļėˆ˜ëĄœ ė „ë‹Žë˜ė–ī 1ėīˆë§ˆë‹Ī í˜ļėķœë˜ęļ° ë•ŒëŽļ뗐
ëđ„록 (ėĶ‰ė‹œ ė‹Ī행 í•Ļėˆ˜ëĄœ 표현된) ėĩ멅 í•Ļėˆ˜ė˜ ė‹Ī행 ėŧĻ텍ėŠĪíŠļ가 ėĒ…ëĢŒë˜ė—ˆë”ëžë„ (ęģ„ė†í•īė„œ í˜ļėķœėī 될 inner í•Ļ눘ëĨž ėœ„í•ī) ëģ€ėˆ˜ a는 ė‚Žëžė§€ė§€ ė•ŠëŠ”ë‹Ī.

// addEventListener
(function () {
  var count = 0;
  var button = document.createElement("button");
  button.innerText = "click";
  button.addEventListener("click", function () {
    console.log(++count, "times clicked");
  });
  document.body.appendChild(button);
})

buttonė„ bodyė˜ ë§ˆė§€ë§‰ ėžė‹ ėš”ė†ŒëĄœ ėķ”ę°€í•˜ëĐīė„œ (ėĶ‰ė‹œ ė‹Ī행 í•Ļėˆ˜ëĄœ 표현된) ėĩ멅 í•Ļėˆ˜ė˜ ė‹Ī행ėī 뙄ëĢŒë˜ė–ī ėĩ멅 í•Ļėˆ˜ė˜ ė‹Ī행 ėŧĻ텍ėŠĪíŠļ가 ėĒ…ëĢŒëœë‹Ī.
ę·ļ럮나, ėĩ멅 í•Ļėˆ˜ė—ė„œ ė„ ė–ļ된 ëģ€ėˆ˜ countëĨž ė°ļėĄ°í•˜ëŠ” (ėīëēĪíŠļ ëĶŽėŠĪ너) ėĩ멅 í•Ļėˆ˜ę°€ addEventListenerė˜ ė―œë°ą í•Ļėˆ˜ëĄœ ė „ë‹Žë˜ė–ī ëē„튞ėī íīëĶ­ë  때마ë‹Ī í˜ļėķœë  ęēƒėīęļ° ë•ŒëŽļ뗐
ëđ„록 (ėĶ‰ė‹œ ė‹Ī행 í•Ļėˆ˜ëĄœ 표현된) ėĩ멅 í•Ļėˆ˜ė˜ ė‹Ī행 ėŧĻ텍ėŠĪíŠļ가 ėĒ…ëĢŒë˜ė—ˆë”ëžë„ (ëē„튞ėī íīëĶ­ë  때마ë‹Ī ęģ„ė†í•īė„œ í˜ļėķœėī 될 ėīëēĪíŠļ ëĶŽėŠĪ너 ėĩ멅 í•Ļ눘ëĨž ėœ„í•ī) ëģ€ėˆ˜ count는 ė‚Žëžė§€ė§€ ė•ŠëŠ”ë‹Ī.

2) íīëĄœė €ė™€ ëДëŠĻëĶŽ ęī€ëĶŽ 🙋‍♀ïļ

íīëĄœė €ëŠ” ė˜ë„ė ėœžëĄœ í•Ļėˆ˜ė˜ 맀뗭 ëģ€ėˆ˜ëĨž ëДëŠĻëĶŽëĨž ė†ŒëŠĻ하도록 í•ĻėœžëĄœėĻ ë°œėƒí•œë‹Ī.
ë”°ëžė„œ, ëДëŠĻëĶŽëĨž íšĻėœĻė ėœžëĄœ ęī€ëĶŽí•˜ęļ° ėœ„í•īė„œëŠ” ę·ļ í•„ėš”ė„ąėī ė‚Žëžė§„ ė‹œė ė—ëŠ” 더는 ëДëŠĻëĶŽëĨž ė†ŒëŠĻí•˜ė§€ ė•Šë„ëĄ í•īė•ž 한ë‹Ī.

ė°ļėĄ° ėđīėšīíŠļëĨž 0ėœžëĄœ 만ë“ĪëĐī, 가ëđ„ė§€ ėŧŽí…í„°(GC)ė˜ ėˆ˜ęą° ëŒ€ėƒėī 되ęģ , GC가 ėˆ˜ęą°í•ī가ëĐī ė†ŒëŠĻ됐던 ëДëŠĻëĶŽę°€ íšŒėˆ˜ëœë‹Ī.
ė°ļėĄ° ėđīėšīíŠļëĨž 0ėœžëĄœ 만ë“Īęļ° ėœ„í•īė„œëŠ” ė‹ëģ„ėžė— ė°ļėĄ°í˜•ėī ė•„ë‹Œ ęļ°ëģļ형 데ėī터(null 또는 undefined)ëĨž 할ë‹đí•īė•ž 한ë‹Ī.

3) íīëĄœė € 활ėšĐ ė‚ŽëĄ€

(1) ė―œë°ą í•Ļ눘 ë‚īëķ€ė—ė„œ ė™ļëķ€ ë°ėī터ëĨž ė‚ŽėšĐ하ęģ ėž 할 때

ėīëēĪíŠļ ëĶŽėŠĪ너 í•Ļ눘ëĨž ė˜ˆëĄœ ë“Īė—ˆë‹Ī.

ë°Đëē• 1: ė―œë°ą í•Ļ눘ëĨž ë‚īëķ€ í•Ļėˆ˜ëĄœ ė„ ė–ļí•īė„œ ė™ļëķ€ ëģ€ėˆ˜ëĨž 링렑 ė°ļėĄ°í•˜ęļ°

ėīëēĪíŠļ ëĶŽėŠĪ너 ė•ˆė—ė„œ ė―œë°ą í•Ļ눘ëĨž 'ė„ ė–ļ'하ëĐīė„œ ę·ļ ė•ˆė—ė„œ ė™ļëķ€ ëģ€ėˆ˜ëĨž 링렑 ė°ļėĄ°í•˜ë„ëĄ 한ë‹Ī.
íīëĄœė €ëĨž ėīėšĐ한 ë°Đëē•ėīë‹Ī.

var fruits = ["apple", "banana", "peach"];
var $ul = document.createElement("ul");

fruits.forEach(function (fruit) {
  var $li = document.createElement("li");
  $li.innerText = fruit;
  $li.addEventListener("click", function () { // ė―œë°ą í•Ļ눘ëĨž ë‚īëķ€ í•Ļėˆ˜ëĄœ ė„ ė–ļ
    alert("your choice is " + fruit); // ė™ļëķ€ ëģ€ėˆ˜ fruit 링렑 ė°ļėĄ°
  });
  $ul.appendChild($li);
});

document.body.appendChild($ul);

ë°Đëē• 2: bind ëĐ”ė„œë“œëĄœ ę°’ė„ 링렑 넘ęēĻėĢžęļ°

ėœ„ ė˜ˆė œė—ė„œ 반ëģĩė„ ėĪ„ėīęļ° ėœ„í•ī ė―œë°ą í•Ļ눘(ėīëēĪíŠļ ëĶŽėŠĪ너 í•Ļ눘)ëĨž ė™ļëķ€ëĄœ ëķ„ëĶŽí•œ 후 ėīëēĪíŠļ ëĶŽėŠĪ너 í•Ļėˆ˜ëĄœ 등록할 때 bind ëĐ”ė„œë“œëĨž ė‚ŽėšĐ한ë‹Ī.
(bind ëĐ”ė„œë“œëĨž ė‚ŽėšĐí•˜ė§€ ė•ŠėœžëĐī alertFruit í•Ļėˆ˜ė—ė„œ ėļėžëĄœ 넘ęēĻėĪ€ fruit는 ėīëēĪíŠļ 객ėēī가 된ë‹Ī.)

ėī ë°Đëē•ė„ ė‚ŽėšĐ하ëĐī ëŊļëĶŽ bind ëĐ”ė„œë“œëĄœ ę°’ė„ 링렑 넘ęēĻėĢžęļ° ë•ŒëŽļ뗐 íīëĄœė €ëŠ” ë°œėƒí•˜ė§€ ė•ŠëŠ”ë‹Ī.
ę·ļ럮나, bind ëĐ”ė„œë“œëĨž ė‚ŽėšĐ하ëĐī bind ëĐ”ė„œë“œė˜ ėēŦ ëēˆė§ļ ėļėžëŠ” ëŽīėĄ°ęąī ėƒˆëĄœ 바ėļë”Đ할 this 값ėīęģ  ėī ę°’ė„ ėƒëžĩ할 눘 ė—†ęļ° ë•ŒëŽļ뗐 ė›ëž˜ė˜ thisëĨž ėœ ė§€í•  눘 ė—†ė„ ëŋ ė•„ë‹ˆëž
ė›ëž˜ëŠ” ėīëēĪíŠļ ëĶŽėŠĪ너 í•Ļėˆ˜ė—ė„œ ėēŦ ëēˆė§ļ ėļėžëĄœ ė˜Ī는 ėīëēĪíŠļ 객ėēī가 bind ëĐ”ė„œë“œė— ė˜í•ī 두 ëēˆė§ļ ėļėžę°€ 되는 ė ė„ ę°ė•ˆí•īė•ž 한ë‹Ī.

...
var alertFruit = function (fruit) {
  alert("your choice is " + fruit);
};

fruits.forEach(function (fruit) {
  var $li = document.createElement("li");
  $li.innerText = fruit; // ė—Žęļ° fruitëĨž
  $li.addEventListener("click", alertFruit.bind(null, fruit)); // alertFruitė˜ ėēŦ ëēˆė§ļ ėļėžëĄœ 넘ęēĻėΌ
  $ul.appendChild($li);
});
...

ë°Đëē• 3: ęģ ė°Ļ í•Ļ눘 활ėšĐ하ęļ°

ęģ ė°Ļ í•Ļėˆ˜ëž€ í•Ļ눘ëĨž ėļėžëĄœ 받거나 'í•Ļ눘ëĨž return' 하는 í•Ļ눘ëĨž 말한ë‹Ī.
ėī 또한 $li가 íīëĶ­ëė„ 때 fruit ëģ€ėˆ˜ė˜ ę°’ė„ ėīëŊļ ėĒ…ëĢŒëœ forEach ė‹Ī행 ėŧĻ텍ėŠĪíŠļė—ė„œ ė°ūė•„ė•ž 하ëŊ€ëĄœ íīëĄœė €ëĨž 렁ę·đė ėœžëĄœ 활ėšĐ한 ë°Đëē•ėīë‹Ī.
bind ëĐ”ė„œë“œëĨž ėīėšĐ한 ë°Đëē•ęģžëŠ” 닮ëĶŽ, ė―œë°ą í•Ļ눘(ėīëēĪíŠļ ëĶŽėŠĪ너 í•Ļ눘) ë‚īëķ€ė˜ this뙀 ę·ļ ėēŦ ëēˆė§ļ ėļėž(ėīëēĪíŠļ 객ėēī)도 ëģ€ęē―하는 ėž ė—†ėī ė™ļëķ€ ëģ€ėˆ˜ëĨž ė°ļėĄ°í•  눘 ėžˆë„ëĄ 한ë‹Ī.

var alertFruitBuilder = function (fruit) {
  return function () { // ėīëēĪíŠļ ëĶŽėŠĪ너 í•Ļėˆ˜ė˜ ėēŦ ëēˆė§ļ ėļėžëĄœëŠ” ė›ëž˜ëŒ€ëĄœ ėīëēĪíŠļ 객ėēī가 ė˜ĪęēŒ ëœë‹Ī
    alert("your choice is " + fruit);
  };
}

fruits.forEach(function (fruit) {
  var $li = document.createElement("li");
  $li.innerText = fruit;
  $li.addEventListener("click", alertFruitBuilder(fruit));
  $ul.appendChild($li);
});

(2) ė ‘ę·ž ęķŒí•œ 렜ė–ī (ė •ëģī ė€ë‹‰)

ė •ëģī ė€ë‹‰ėī란 ė–īë–Ī ëŠĻë“ˆė˜ ë‚īëķ€ ëĄœė§ė— 대í•ī ė™ļëķ€ëĄœė˜ ë…ļėķœė„ ėĩœė†Œí™”하는 ęēƒė„ 말한ë‹Ī.
ėžë°”ėŠĪ큎ëĶ―íŠļ는 ęļ°ëģļė ėœžëĄœ ëģ€ėˆ˜ ėžėēī뗐 ė ‘ę·ž ęķŒí•œė„ 링렑 ëķ€ė—Ží•˜ë„록 ė„Īęģ„되ė–ī ėžˆė§€ëŠ” ė•Šë‹Ī.
ę·ļ럮나, íīëĄœė €ëĨž 활ėšĐ하ëĐī í•Ļ눘 ė°Ļė›ė—ė„œ, public한 값ęģž private한 ę°’ė„ ęĩŽëķ„í•  눘 ėžˆë‹Ī.

ėīëĨž ėœ„í•ī 객ėēī가 ė•„ë‹Œ 'í•Ļ눘'ė—ė„œ 맀뗭ëģ€ėˆ˜ 및 ë‚īëķ€ í•Ļ눘 ë“ąė„ ėƒė„ąí•œ 후 ë‚īëķ€ė—ė„œë§Œ ė‚ŽėšĐ할 ė •ëģīë“Īė€ return í•˜ė§€ ė•Šęģ , ė™ļëķ€ė— 렜ęģĩ하ęģ ėž 하는 ė •ëģīë“Ī만 ëŠĻė•„ė„œ return 하도록 한ë‹Ī.
ė™ļëķ€ė— 렜ęģĩ하ęģ ėž 하는 ëŒ€ėƒėī ė—ŽëŸŋėž 때는 '객ėēī 또는 ë°°ė—ī', í•˜ë‚˜ėž 때는 'í•Ļ눘'ëĨž return 한ë‹Ī.

ėī때 return í•˜ė§€ ė•Šė€ ëŒ€ėƒė—ëŠ” ë‹đė—°ížˆ ė ‘ę·ží•  눘 ė—†ė§€ë§Œ return 한 ëŒ€ėƒë„ ë‹ĪëĨļ ë‚īėšĐėœžëĄœ ëŪė–īė”Œėš°ęļ°ëĨž 할 눘 ėžˆęļ° ë•ŒëŽļ뗐 객ėēīëĨž return 하ęļ° ė „ė— ëŊļëĶŽ ëģ€ęē―할 눘 ė—†ë„ëĄ Object.freeze()ëĨž ėīėšĐí•īė•ž 한ë‹Ī.

var createCar = function () {
  // ė ‘ę·ž ęķŒí•œ x
  var fuel = ...
  var power = ...
  var moved = ...
  
  // ė ‘ę·ž ęķŒí•œ o
  var publicMembers = {
    get moved () { // ė―ęļ° ė „ėšĐ ė†ė„ą
      return moved;
    }
    run: function () {
      ...
    }
  };
  Object.freeze(publicMembers);
  return publicMembers;
};

var car = createCar();

(3) ëķ€ëķ„ ė ėšĐ í•Ļ눘

ëķ€ëķ„ ė ėšĐ í•Ļėˆ˜ëž€ nę°œė˜ ėļėžëĨž 받는 í•Ļėˆ˜ė— ëŊļëĶŽ mę°œė˜ ėļėžë§Œ 넘ęēĻ ęļ°ė–ĩė‹œėž°ë‹Ī가, 나ėΑ뗐 (n-m) ę°œė˜ ėļėžëĨž 넘ęēĻ ëđ„ëĄœė†Œ ė›ëž˜ í•Ļėˆ˜ė˜ ė‹Ī행 ęē°ęģžëĨž ė–ŧė„ 눘 ėžˆë„ëĄ 하는 í•Ļ눘ėīë‹Ī.

ë°Đëē• 1: bind ëĐ”ė„œë“œ

var add = function () {
  var result = 0;
  for (var i = 0; i < arguments.length; i++) {
    result += arguments[i];
  }
  return result;
};

var addPartial = add.bind(null, 1, 2, 3, 4, 5);
console.log(6, 7, 8, 9, 10); // 55

ę·ļ럮나, bind ëĐ”ė„œë“œëĨž ė‚ŽėšĐ하ëĐī ė•žė„œ ė‚īíŽīëģļ ęēƒėē˜ëŸž thisëĨž ëŽīėĄ°ęąī ëģ€ęē―í•īė•ž 하ęļ° ë•ŒëŽļ뗐 ëĐ”ė„œë“œė—ė„œëŠ” ė‚ŽėšĐ할 눘 ė—†ë‹Ī는 ëŽļė œę°€ ėžˆë‹Ī.

ë°Đëē• 2: ëķ€ëķ„ ė ėšĐ í•Ļ눘 ęĩŽí˜„

var partial = function () {
  var originalPartialArgs = arguments;
  var func = originalPartialArgs[0];
  if (typeof fun !== "function") {
    throw new Error("ėēŦ ëēˆė§ļ ėļėžę°€ í•Ļėˆ˜ę°€ ė•„ë‹™ë‹ˆë‹Ī.");
  }
  return function () {
    var partialArgs = Array.prototype.slice.call(originalPartialArgs, 1);
    var restArgs = Array.prototype.slice.call(arguments);
    return func.apply(this, partialArgs.concat(restArgs));
  }
}

var add = function () {
  var result = 0;
  for (var i = 0; i < arguments.length; i++) {
    result += arguments[i];
  }
  return result;
};

const addPartial = partial(add, 1, 2, 3, 4, 5);
console.log(addPartial(6, 7, 8, 9, 10)); // 55

var dog = {
  name: "ę°•ė•„ė§€",
  greet: partial(function(prefix, suffix) {
    return prefix + this.name + suffix;
  }, "ė™ˆė™ˆ, "),
};
console.log(dog.greet("ėž…ë‹ˆë‹Ī!")); // ė™ˆė™ˆ, ę°•ė•„ė§€ėž…ë‹ˆë‹Ī!

ë‹Ī만, ėī는 ëķ€ëķ„ ė ėšĐ í•Ļėˆ˜ė— 넘ęļļ ėļėžëĨž ë°˜ë“œė‹œ ė•žė—ė„œëķ€í„° ė°Ļ례로 ė „ë‹Ží•  ėˆ˜ë°–ė— ė—†ë‹Ī.

ë°Đëē• 3: ëķ€ëķ„ ė ėšĐ í•Ļ눘 ęĩŽí˜„ (ėˆ˜ė •)

ėē˜ėŒė— 넘ęēĻėĪ€ ėļėžë“Ī ėĪ‘ _로 ëđ„ė›Œë†“ė€ ęģĩ간마ë‹Ī 나ėΑ뗐 넘ė–īė˜Ļ ėļėžë“Īėī ė°Ļ례대로 ëžė›Œë„Ģ도록 ęĩŽí˜„í•  눘 ėžˆë‹Ī.

→ ë°Đëē• 2뙀 ë°Đëē• 3ė€ ëŊļëĶŽ ėžëķ€ ėļėžëĨž 넘ęēĻ두ė–ī ęļ°ė–ĩ하ęēŒë” 하ęģ , ėķ”후 í•„ėš”í•œ ė‹œė ė— ęļ°ė–ĩ했던 ėļėžë“ĪęđŒė§€ í•Ļęŧ˜ ė‹Ī행하도록 한ë‹Ī는 ė ė—ė„œ íīëĄœė €ëĨž í•ĩė‹Ž ęļ°ëē•ėœžëĄœ ė‚ŽėšĐ했ë‹Īęģ  í•  눘 ėžˆë‹Ī.

디바ėšīėŠĪ

디바ėšīėŠĪ란 ė§§ė€ ė‹œę°„ ë™ė•ˆ ë™ėží•œ ėīëēĪíŠļ가 많ėī ë°œėƒí•œ ęē―뚰 ėīëĨž ė „ëķ€ ėē˜ëĶŽí•˜ė§€ ė•Šęģ  ėē˜ėŒ 또는 ë§ˆė§€ë§‰ė— ë°œėƒí•œ ėīëēĪíŠļ뗐 대í•īė„œ 한 ëēˆë§Œ ėē˜ëĶŽí•˜ëŠ” ęēƒė„ 말한ë‹Ī.

var debounce = function (eventName, func, wait) {
  var timeoutId = null;
  return function (event) { // 2-1. ė—Žęļ°ė„œ event는 ėīëēĪíŠļ 객ėēī
    var self = this; // 1-1. ė—Žęļ°ė„œ this는 ė―œë°ą í•Ļėˆ˜ė— 대한 렜ė–īęķŒė„ ę°€ė§€ëŠ” addEventListener ëĐ”ė„œë“œė— ė˜í•ī body가 된ë‹Ī
    console.log(eventName, "event ë°œėƒ");
    clearTimeout(timeoutId);
    timeoutId = setTimeout(func.bind(self, event), wait);
    // 1-2. ę·ļ bodyëĨž func í•Ļ눘 ë‚īëķ€ė˜ this로 바ėļë”Đ한ë‹Ī.
    // 2-2. ę·ļ ėīëēĪíŠļ 객ėēīëĨž funcė˜ ėēŦ ëēˆė§ļ ėļėžëĄœ ė „í•īėĪ€ë‹Ī.
  };
};

var moveHandler = function (e) { // 2-3. ė—Žęļ°ė„œ e는 ėīëēĪíŠļ 객ėēī가 된ë‹Ī.
  console.log("move event ėē˜ëĶŽ");
};
var wheelHandler = function (e) {
  console.log("wheel evnet ėē˜ëĶŽ");
};

document.body.addEventListener("mousemove", debounce("move", moveHandler, 500));
document.body.addEventListener("mousewheel", debounce("wheel", wheelHandler, 700));

ėœ„ ė―”ë“œė˜ ęē°ęģž, ë§ˆėš°ėŠĪëĨž ëđ ëĨīęēŒ ęģ„ė† 뛀링ėīëĐī 'mouse event ë°œėƒ' ėī띾는 ëŽļęĩŽëŠ” ęģ„ė† ëœĻė§€ë§Œ, 'mouse event ėē˜ëĶŽ' 띾는 ëŽļęĩŽëŠ” ë§ˆėš°ėŠĪ ė›€ė§ėž„ė„ ëĐˆė·„ė„ 때 ë§ˆė§€ë§‰ 한 ëēˆë§Œ 뜮ë‹Ī.
setTimeoutė˜ ė―œë°ą í•Ļ눘(ė͉, mouseHandler)가 ė‹Ī행되ęļ° ė „ė—(ë§ˆėš°ėŠĪ ėīëēĪíŠļ가 ë°œėƒí•˜ęģ  0.5ėīˆę°€ ė§€ë‚˜ęļ° ė „ė—) ë‹ĪëĨļ ë§ˆėš°ėŠĪ ėīëēĪíŠļ가 또 ë°œėƒí•īė„œ ėī렄뗐 ė‹Ī행된 setTimeout í•Ļėˆ˜ę°€ clearTimeout뗐 ė˜í•ī ė·Ļė†Œë˜ė—ˆęļ° ë•ŒëŽļėīë‹Ī.
ė°ļęģ ëĄœ ė—Žęļ°ė„œ íīëĄœė €ëĄœ ėē˜ëĶŽë˜ëŠ” ëģ€ėˆ˜ė—ëŠ” eventName, func, wait, timeoutId가 ėžˆë‹Ī.

(4) ėŧĪ링 í•Ļ눘

ėŧĪ링 í•Ļėˆ˜ëž€ ė—ŽëŸŽ ę°œė˜ ėļėžëĨž 받는 í•Ļ눘ëĨž í•˜ë‚˜ė˜ ėļėžë§Œ 받는 í•Ļėˆ˜ëĄœ ë‚˜ëˆ ė„œ 눜ė°Ļė ėœžëĄœ í˜ļėķœë  눘 ėžˆęēŒ ėēīėļ 형태로 ęĩŽė„ąí•œ ęēƒė„ 말한ë‹Ī.

ëķ€ëķ„ ė ėšĐ í•Ļ눘 vs ėŧĪ링 í•Ļ눘

ëķ€ëķ„ ė ėšĐ í•Ļėˆ˜ëŠ” ė—ŽëŸŽ ę°œė˜ ėļėžëĨž ė „ë‹Ží•  눘 ėžˆė§€ë§Œ, ėŧĪ링 í•Ļėˆ˜ëŠ” 한 ëēˆė— í•˜ë‚˜ė˜ ėļėžë§Œ ė „ë‹Ží•œë‹Ī.
ëķ€ëķ„ ė ėšĐ í•Ļėˆ˜ëŠ” ė‹Ī행 ęē°ęģžëĨž ėžŽė‹Ī행할 때마ë‹Ī 뛐ëģļ í•Ļėˆ˜ę°€ ëŽīėĄ°ęąī ė‹Īí–‰ë˜ė§€ë§Œ, ėŧĪ링 í•Ļėˆ˜ëŠ” ë§ˆė§€ë§‰ ėļėžę°€ ė „ë‹Žë˜ęļ° ė „ęđŒė§€ëŠ” 뛐ëģļ í•Ļėˆ˜ę°€ ė‹Īí–‰ë˜ė§€ ė•ŠëŠ”ë‹Ī.

var curry3 = function (func) {
  return function (a) {
    return function (b) {
      return func(a, b);
    };
  };
};

var getMaxWith10 = curry3(Math.max)(10);
console.log(getMaxWith10(8)); // 10
console.log(getMaxWith10(25)); // 25

// ES6
var curry3 = func => a => b => func(a, b);
// curry3ė€ funcëĨž ėļėžëĄœ ę°€ė§€ëŠ” í•Ļ눘ėīë‹Ī
// funcëĨž ėļėžëĄœ ę°€ė§€ëŠ” í•Ļėˆ˜ëŠ” aëĨž ėļėžëĄœ ę°€ė§€ëŠ” í•Ļ눘ëĨž return 한ë‹Ī
// aëĨž ėļėžëĄœ ę°€ė§€ëŠ” í•Ļėˆ˜ëŠ” bëĨž ėļėžëĄœ ę°€ė§€ëŠ” í•Ļ눘ëĨž return 한ë‹Ī
// bëĨž ėļėžëĄœ ę°€ė§€ëŠ” í•Ļėˆ˜ëŠ” func(a, b)ëĨž ė‹Ī행한 ę°’ė„ return 한ë‹Ī

각 ë‹Ļęģ„ė—ė„œ ë°›ė€ ėļėžë“Īė„ ëŠĻ두 ë§ˆė§€ë§‰ ë‹Ļęģ„ė—ė„œ ė°ļėĄ°í•  ęēƒėīëŊ€ëĄœ 가ëđ„ė§€ ėŧŽë ‰íŒ…ë˜ė§€ ė•Šęģ  ëДëŠĻëĶŽė— ė°ĻęģĄė°ĻęģĄ ėŒ“ė˜€ë‹Ī가, ë§ˆė§€ë§‰ í˜ļėķœëĄœ ė‹Ī행 ėŧĻ텍ėŠĪíŠļ가 ėĒ…ëĢŒëœ í›„ė—ė•ž ëđ„ëĄœė†Œ 한깾ëēˆė— 가ëđ„ė§€ ėŧŽë ‰íŒ… 된ë‹Ī.

ë”°ëžė„œ, í•Ļ눘ëĨž ė›í•˜ëŠ” ė‹œė ęđŒė§€ ė§€ė—°ė‹œėž°ë‹Ī가 ė‹Īí–‰ė‹œí‚Ž í•„ėš”ę°€ ėžˆëŠ” ęē―뚰 ėŧĪ링 í•Ļ눘ëĨž ė‚ŽėšĐ할 눘 ėžˆë‹Ī.
í˜đė€ í•Ļėˆ˜ė˜ ë§Ī氜ëģ€ėˆ˜ę°€ í•­ėƒ ëđ„ėŠ·í•˜ęģ  ėžëķ€ë§Œ 바뀌는 ęē―ėš°ė—ë„ ėŧĪ링 í•Ļ눘ëĨž 뜠ėšĐ하ęēŒ ė‚ŽėšĐ할 눘 ėžˆë‹Ī.
íŠđ히 fetch í•Ļėˆ˜ę°€ urlė„ ë°›ė•„ í•īë‹đ url뗐 HTTP ėš”ėē­ė„ 할 때 ėĢžëĄœ ė‚ŽėšĐ된ë‹Ī.

var getInformation = baseUrl => path => id => fetch(baseUrl + path + "/" + id);

var imageUrl = "http://imageAddress.com";
var getImage = getInformation(imageUrl); // baseUrl ë„ĢėŒ
var getEmoticon = getImage("emoticon"); // path ë„ĢėŒ
var emoticon = getEmoticon(100); // ė‹Ī렜 ėš”ėē­

🙋‍♀ïļ ė§ˆëŽļ

  1. íīëĄœė €ė™€ ëДëŠĻëĶŽ ęī€ëĶŽ
    똈렜 ė―”ë“œę°€ ėīí•ī가 ė•ˆëĻ (ėą… ė°ļęģ )

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

  1. í”„ëĄœí† íƒ€ėž…
profile
ëŠĨë™ė ėœžëĄœ ė‚īėž, 행ëģĩ하ęēŒðŸ˜

0ę°œė˜ 댓ęļ€