[JS] ํด๋กœ์ €(Closure)๋ž€?๐Ÿค”

TATAยท2023๋…„ 1์›” 2์ผ
0

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
7/25

โœ”๏ธ ํด๋กœ์ €(Closure)๋ž€?๐Ÿค”

"ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ์–ดํœ˜์ (lexical) ํ™˜๊ฒฝ์˜ ์กฐํ•ฉ์„ ๋งํ•œ๋‹ค.
์ด ํ™˜๊ฒฝ์€ ํด๋กœ์ €๊ฐ€ ์ƒ์„ฑ๋œ ์‹œ์ ์˜ ์œ ํšจ ๋ฒ”์œ„ ๋‚ด์— ์žˆ๋Š” ๋ชจ๋“  ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ๋‹ค."

๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜๋ฉด ํ•จ์ˆ˜ ์•ˆ์— ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ณ ,
๊ทธ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ๋ณ€์ˆ˜๋“ค์€ ์ง€์—ญ ๋ณ€์ˆ˜์ด๋‹ค.

function init() {
  var name = "Mozilla"; // name์€ init์— ์˜ํ•ด ์ƒ์„ฑ๋œ ์ง€์—ญ ๋ณ€์ˆ˜์ด๋‹ค.
  function displayName() {
    // displayName() ์€ ๋‚ด๋ถ€ ํ•จ์ˆ˜์ด๋ฉฐ, ํด๋กœ์ €๋‹ค.
    alert(name); // ๋ถ€๋ชจ ํ•จ์ˆ˜์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  }
  displayName();
}
init();

๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ํด๋กœ์ € ํ•จ์ˆ˜ ์‚ฌ์šฉ์œผ๋กœ
์žฌ์‚ฌ์šฉ์ด ์šฉ์ดํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

const tagMaker = (tag) => (content) => `<${tag}>${content}</${tag}>`;

const divMaker = tagMaker("div");
divMaker("hello"); // "<div>hello</div>"
divMaker("TATA"); // "<div>TATA</div>"

const ancjorMaker = tagMaker("a");
divMaker("go"); // "<a>go</a>"
divMaker("velog"); // "<a>velog</a>"

โœ”๏ธ ํด๋กœ์ € ๋ชจ๋“ˆ ํŒจํ„ด

๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ๋‹จ ํ•˜๋‚˜๋งŒ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒƒ์— ๊ทธ์น˜์ง€ ์•Š๊ณ ,
๊ฐ์ฒด์— ๋‹ด์•„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋„๋ก ๋งŒ๋“ ๋‹ค.

const makeCounter = () => {
  let value = 0;

  return {
    increase: () => {
      value = value + 1
    },
    decrease: () => {
      value = value - 1
    },
    getValue: () => value
  }
}
// makeCounter ํ•จ์ˆ˜๋Š”
// increase, decrease, getValue ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•œ ๊ฐ์ฒด ํ•˜๋‚˜๋ฅผ ๋ฆฌํ„ด

const counter1 = makeCounter(); // counter1์€ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
counter1.increase(); // 1
counter1.increase(); // 2
counter1.decrease(); // 1
counter1.getValue(); // 1

const counter2 = makeCounter(); // counter2๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
counter2.decrease(); // -1
counter2.decrease(); // -2
counter2.decrease(); // -2
counter2.getValue(); // -3

โœ”๏ธ ํด๋กœ์ €๋ฅผ ํ™œ์šฉํ•œ toggle ์˜ˆ์ œ

  • HTML
<button class="toggle">toggle</button>
<div class="box" style="width: 100px; height: 100px; background: red;"></div>
  • JavaScript
const box = document.querySelector(".box");
const toggleBtn = document.querySelector(".toggle");

const toggle = (function () {
  let isShow = false;

  // TODO: โ‘  ํด๋กœ์ €๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.
  return function () {
    // TODO: โ‘ข isShow ๋ณ€์ˆ˜์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.
    box.style.display = isShow ? "block" : "none";
    isShow = !isShow;
  };
})();

// โ‘ก ์ด๋ฒคํŠธ ํ”„๋กœํผํ‹ฐ์— ํด๋กœ์ €๋ฅผ ํ• ๋‹น
toggleBtn.onclick = toggle;
profile
๐Ÿพ

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