[TIL] 220110

Lee Syong·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개ė˜ 댓ęļ€