"ํจ์์ ํจ์๊ฐ ์ ์ธ๋ ์ดํ์ (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
<button class="toggle">toggle</button>
<div class="box" style="width: 100px; height: 100px; background: red;"></div>
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;