ํด๋ก์ ๋ ํจ์๋ฅผ ์ผ๊ธ ๊ฐ์ฒด๋ก ์ทจ๊ธํ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฌ์ฉ๋๋ ์ค์ํ ํน์ฑ์ด๋ค.
MDN "ํด๋ก์ ๋ ํจ์์ ๊ทธ ํจ์๊ฐ ์ ์ธ๋ ๋ ์์ปฌ ํ๊ฒฝ๊ณผ์ ์กฐํฉ์ด๋ค."
์ ์ผ ๋จผ์ ์ดํดํด์ผ ํ ํต์ฌ ํค์๋๋ "ํจ์๊ฐ ์ ์ธ๋ ๋ ์์ปฌ ํ๊ฒฝ"์ด๋ค.
const x = 1;
function outerFunc() {
const x = 10;
function innerFunc() {
console.log(x); // 10
}
innerFunc();
}
outerFunc();
7๋ฒ์งธ ์ค ์ฝ์์์ 10์ด ๋์จ ์ด์ : ์์ ์ด ์ ์๋ ํ๊ฒฝ( ์์์ค์ฝํ )๋ฅผ ๊ธฐ์ตํ๋ค.
ํจ์์์ ๋ด๋ถ๋ ์ธ๋ถ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง, ์ธ๋ถ์์ ๋ด๋ถ ๊ฐ์ผ๋ก๋ ์ ๊ทผํ ์ ์๋ค.
outerFunc
ํจ์ ๋ด๋ถ์์ ์ค์ฒฉ ํจ์ innerFunc
๊ฐ ์ ์, ํธ์ถ๋์๋ค.
์ค์ฒฉ ํจ์ innerFunc
์ ์์ ์ค์ฝํ๋ outerFunc
์ด๋ค.
์ค์ฒฉ ํจ์ innerFunc
๋ด๋ถ์์ ์์ ์ ํฌํจํ๊ณ ์๋ ์ธ๋ถ ํจ์ outerFunc
์ x
๋ณ์์ ์ ๊ทผํ ์ ์๋ค.
const x = 1;
function outerFunc() {
const x = 10;
innerFunc();
}
function innerFunc() {
console.log(x); // 1
}
outerFunc();
outerFunc
๋ด๋ถ์ ์๋ ๊ฒ์ด ์๋๋ผ ๋ฐ๋ก ์๋ค. innerFunc
์ ์์ ์ค์ฝํ๋ ์ ์ญ์ด๊ธฐ ๋๋ฌธ์ 9๋ฒ ์ค ์ฝ์์ ๊ฒฐ๊ณผ๊ฐ์ 1์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํจ์๋ฅผ ์ด๋์ ํธ์ถํ๋์ง๊ฐ ์๋๋ผ ํจ์๋ฅผ ์ด๋์ ์ ์ํ๋์ง์ ๋ฐ๋ผ ์์ ์ค์ฝํ๋ฅผ ๊ฒฐ์ ํ๋๋ฐ, ์ด๋ฅผ ๋ ์์ปฌ ์ค์ฝํ ( ์ ์ ์ค์ฝํ ) ๋ผ๊ณ ํ๋ค.
const x = 1;
function foo() {
const x = 10;
bar();
} // ์ ์ญ ํจ์
function bar() {
console.log(x);
} // ์ ์ญ ํจ์
foo(); // ?
bar(); // ?
๊ฒฐ๊ณผ ๊ฐ์ ๋ฌด์์ผ๊น?
์ด์ ๋ ๋ฌด์์ผ๊น?
bar
ํจ์์ ์์ ์ค์ฝํ๋? => ์ ์ญ
foo
ํจ์๋ bar
ํจ์๋ฅผ ์คํ์ํค๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ bar
ํจ์๋ฅผ ์คํ์ํจ ๊ฐ์ด ๋์จ๋ค.
์์ ์ค์ฝํ์ ๋ํ ์ฐธ์กฐ๋ ํจ์๊ฐ ์ ์๋๋ ์์ ์์์ ํ๊ฒฝ(์์น)์ ์ํด ๊ฒฐ์ ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ๋ ์์ปฌ ์ค์ฝํ์ด๋ค.
ํธ๋์ด๊ฐ ์ฐ์ฃผ๋ก ๋ฉ์น๋์ด์๋ ๊ธฐ์ต ํ ํธ๋์ด์ ๊ณ ํฅ์ ํธ๋์ด๊ฐ ํ์ด๋ ์์ ์์์ ์์น์ ์ํด ๊ฒฐ์ ๋๋ค.
= ํธ๋์ด๋ ์ง๊ตฌ์์ ํ์ด๋ฌ๊ธฐ ๋๋ฌธ์ ํธ๋์ด์ ๊ณ ํฅ์ ์ง๊ตฌ์ด๋ค.
ํจ์๊ฐ ์ ์๋ ํ๊ฒฝ๊ณผ ํธ์ถ๋๋ ํ๊ฒฝ์ ๋ค๋ฅผ ์ ์๋ค. ํจ์๊ฐ ํธ์ถ๋๋ ํ๊ฒฝ์ ๊ด๊ณ ์์ด ์์ ์ด ์ ์๋ ํ๊ฒฝ, ์์ ์ค์ฝํ๋ฅผ ๊ธฐ์ตํด์ผ ํ๋ค. ์ด๋ฅผ ์ํด ํจ์๋ ์์ ์ ๋ด๋ถ ์ฌ๋กฏ์ ์์ ์ด ์ ์๋ ํ๊ฒฝ, ์์ ์ค์ฝํ์ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๋ค.
ํธ๋์ด๋ ์ด๋ค ํ์ฑ์ ๊ฐ๋๋ผ๋ ํญ์ ์์ ์ ๊ณ ํฅ์ธ ์ง๊ตฌ(์์์ค์ฝํ) ๋ฅผ ๊ธฐ์ตํ๋ค.
const x = 1;
function foo() {
const x = 10;
// ์์ ์ค์ฝํ๋ ํจ์ ์ ์ ํ๊ฒฝ(์์น)์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค.
// ํจ์ ํธ์ถ ์์น์ ์์ ์ค์ฝํ๋ ์๋ฌด๋ฐ ๊ด๊ณ๊ฐ ์๋ค.
bar();
}
// ํจ์ bar๋ ์์ ์ ์์ ์ค์ฝํ, ์ฆ ์ ์ญ ๋ ์์ปฌ ํ๊ฒฝ์ [[Environment]]์ ์ ์ฅํ์ฌ ๊ธฐ์ตํ๋ค.
function bar() {
console.log(x);
}
foo(); // ?
bar(); // ?
const x = 1;
// โ
function outer() {
const x = 10;
const inner = function () { console.log(x); }; // โก
return inner;
}
// outer ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ค์ฒฉ ํจ์ inner๋ฅผ ๋ฐํํ๋ค.
// ๊ทธ๋ฆฌ๊ณ outer ํจ์์ ์คํ ์ปจํ
์คํธ๋ ์คํ ์ปจํ
์คํธ ์คํ์์ ํ๋์ด ์ ๊ฑฐ๋๋ค.
const innerFunc = outer(); // โข
innerFunc(); // โฃ 10
innerFunc
์ ์คํ ๊ฐ์ด 10์ด ๋์ค๋ ๊ณผ์
: outer
ํจ์๋ฅผ ํธ์ถ (3) => ์ค์ฒฉ ํจ์ inner
๋ฅผ ๋ฐํ => ์๋ช
์ฃผ๊ธฐ ๋ง๊ฐ => outer
ํจ์ ์คํ ์ข
๋ฃ => ์คํ ์ปจํ
์คํธ์์ ์ ๊ฑฐ => outer
ํจ์์ ์ง์ญ๋ณ์ x
(10) ์ ์๋ช
์ฃผ๊ธฐ ๋ง๊ฐ
์๋ช
์ฃผ๊ธฐ๊ฐ ๋ง๊ฐ๋์ด ๋ณ์ x
(10)์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ด ๋ณด์ด์ง๋ง, ์คํ ๊ฒฐ๊ณผ๋ 10์ด๋ค.
์ธ๋ถ ํจ์๋ณด๋ค ์ค์ฒฉ ํจ์๊ฐ ๋ ์ค๋ ์ ์ง๋๋ ๊ฒฝ์ฐ, ์ค์ฒฉ ํจ์๋ ์ด๋ฏธ ์๋ช ์ฃผ๊ธฐ๊ฐ ์ข ๋ฃํ ์ธ๋ถ ํจ์์ ๋ณ์๋ฅผ ์ฐธ๊ณ ํ ์ ์๋ค. ์ด๋ฌํ ์ค์ฒฉ ํจ์๋ฅผ ํด๋ก์ (closure)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
outer
ํจ์์ ์คํ ์ปจํ
์คํธ๊ฐ ์คํ ์ปจํ
์คํธ ์คํ์์ ์ ๊ฑฐ๋์ง๋ง outer
ํจ์์ ๋ ์์ปฌ ํ๊ฒฝ๊น์ง ์๋ฉธํ๋ ๊ฒ์ ์๋๋ค.
๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๋๊ตฐ๊ฐ๊ฐ ์ฐธ์กฐํ๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํจ๋ถ๋ฌ ํด์ ํ์ง ์๋๋ค.
์ E ( ๊ฐ๋น์ง์ปฌ๋ ํฐ )๊ฐ ํธ๋์ด๋ฅผ ๋ฉ์นํด ์ง๊ตฌ์์ ํธ๋์ด๊ฐ ์์ด์ง๋๋ผ๋ = ์คํ ์ปจํ ์คํธ ์คํ์์ ์คํ ์ปจํ ์คํธ๊ฐ ์ ๊ฑฐ๋๋๋ผ๋
ํธ๋์ด๋ ์์ ์ ๊ณ ํฅ์ธ ์ง๊ตฌ(์์์ค์ฝํ)์ ํ๊ฒฝ์ ๊ธฐ์ตํ๋ค.
๋ ์ค๋ ์์กดํ ์ค์ฒฉ ํจ์๋ ์ธ๋ถ ํจ์์ ์์กด ์ฌ๋ถ(์คํ ์ปจํ
์คํธ์ ์์กด ์ฌ๋ถ)์ ์๊ด์์ด ์์ ์ด ์ ์๋ ์์น์ ์ํด ๊ฒฐ์ ๋ ์์ ์ค์ฝํ๋ฅผ ๊ธฐ์ตํ๋ค. ์ค์ฒฉ ํจ์ inner
๋ด๋ถ์์๋ ์์ ์ค์ฝํ๋ฅผ ์ฐธ์กฐํ ์ ์์ผ๋ฏ๋ก ์์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๊ณ ์๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ ์๋ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ํจ์๋ ์์ ์ค์ฝํ๋ฅผ ๊ธฐ์ตํ๋ฏ๋ก ์ด๋ก ์ ์ผ๋ก ๋ชจ๋ ํจ์๋ ํด๋ก์ ๋ค.
ํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ ํจ์๋ฅผ ํด๋ก์ ๋ผ๊ณ ํ์ง ์๋๋ค.
<!DOCTYPE html>
<html>
<body>
<script>
function foo() {
const x = 1;
const y = 2;
// ์ผ๋ฐ์ ์ผ๋ก ํด๋ก์ ๋ผ๊ณ ํ์ง ์๋๋ค.
function bar() {
const z = 3;
debugger;
// ์์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ์ง ์๋๋ค.
console.log(z);
}
return bar;
}
const bar = foo();
bar();
</script>
</body>
</html>
bar
ํจ์๋ ํด๋ก์ ์ผ๊น?
bar
ํจ์๊ฐ ํด๋ก์ ๊ฐ ์๋ ์ด์ ๋ ๋ญ๊น?
=> ์์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ์ง ์๊ธฐ ๋๋ฌธ์
<!DOCTYPE html>
<html>
<body>
<script>
function foo() {
const x = 1;
// ์ผ๋ฐ์ ์ผ๋ก ํด๋ก์ ๋ผ๊ณ ํ์ง ์๋๋ค.
// bar ํจ์๋ ํด๋ก์ ์์ง๋ง ๊ณง๋ฐ๋ก ์๋ฉธํ๋ค.
function bar() {
debugger;
// ์์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ๋ค.
console.log(x);
}
bar();
}
foo();
</script>
</body>
</html>
bar
ํจ์๋ ํด๋ก์ ์ผ๊น?
๋ค
bar
ํจ์๊ฐ ํด๋ก์ ์ธ ์ด์ ๋?
์์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์
์ค์ฒฉ ํจ์ bar
๋ ํด๋ก์ ์์ง๋ง ์ธ๋ถ ํจ์๋ณด๋ค ์ผ์ฐ ์๋ฉธ๋๊ธฐ ๋๋ฌธ์ ์๋ช
์ฃผ๊ธฐ๊ฐ ์ข
๋ฃ๋ ์ธ๋ถ ํจ์์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค๋ ํด๋ก์ ์ ๋ณธ์ง์ ๋ถํฉํ์ง ์๋๋ค.
์ค์ฒฉ ํจ์ bar
๋ ์ผ๋ฐ์ ์ผ๋ก ํด๋ก์ ๋ผ๊ณ ํ์ง ์๋๋ค.
<!DOCTYPE html>
<html>
<body>
<script>
function foo() {
const x = 1;
const y = 2;
// ํด๋ก์
// ์ค์ฒฉ ํจ์ bar๋ ์ธ๋ถ ํจ์๋ณด๋ค ๋ ์ค๋ ์ ์ง๋๋ฉฐ ์์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ๋ค.
function bar() {
debugger;
console.log(x);
}
return bar;
}
const bar = foo();
bar();
</script>
</body>
</html>
bar
ํจ์๋ ํด๋ก์ ์ผ๊น?
๋ค
bar
ํจ์๊ฐ ํด๋ก์ ์ธ ์ด์ ๋?
- ์ค์ฒฉ ํจ์๊ฐ ์์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ค.
- ์ค์ฒฉ ํจ์๊ฐ ์ธ๋ถ ํจ์๋ณด๋ค ๋ ์ค๋ ์ ์ง๋๋ค.
์์ ๋ณ์ : ํด๋ก์ ์ ์ํด ์ฐธ์กฐ๋๋ ์์ ์ค์ฝํ์ ๋ณ์
= foo
ํจ์์ x
๋ณ์
clousre ๋ ํจ์๊ฐ ์์ ๋ณ์์ ๋ํด ๋ซํ์๋ค (closed) ๋ผ๋ ์๋ฏธ์ด๋ค.
์์ ๋ณ์์ ๋ฌถ์ฌ์๋ ํจ์
ํธ๋์ด๊ฐ ์ง๊ตฌ๋ฅผ ๊ธฐ์ตํ๊ณ ๊ธฐ์ตํ ๋ด์ฉ์ ์จ๋จน์๋๊ฐ ์ง์ ํ ํด๋ก์ !
ํด๋ก์ ์ฌ์ฉ ์ด์ : ์ํ state ๋ฅผ ์์ ํ๊ฒ ๋ณ๊ฒฝํ๊ณ ์ ์งํ๊ธฐ ์ํด์ = ์ํ๊ฐ ์๋์น ์๊ฒ ๋ณ๊ฒฝ๋์ง ์๋๋ก ์ํ๋ฅผ ์์ ํ๊ฒ ์๋ํ๊ณ ํน์ ํจ์์๊ฒ๋ง ์ํ ๋ณ๊ฒฝ์ ํ์ฉํ๊ธฐ ์ํด
num
๋ณ์๋ ์์ ํ๊ฒ ๋ณ๊ฒฝํ๊ณ ์ ์งํด์ผ ํ ์ํ๋ผ๋ ๊ฒ์ ๊ธฐ์ตํ๊ณ ์๋์ ์์ ๋ฅผ ์ดํด๋ด
์๋ค.
// ์นด์ดํธ ์ํ ๋ณ์
let num = 0;
// ์นด์ดํธ ์ํ ๋ณ๊ฒฝ ํจ์
const increase = function () {
// ์นด์ดํธ ์ํ๋ฅผ 1๋งํผ ์ฆ๊ฐ ์ํจ๋ค.
return ++num;
};
console.log(increase()); // 1
console.log(increase()); // 2
console.log(increase()); // 3
์ ์ฝ๋๊ฐ ๋ฐ๋ฅด๊ฒ ๋์ํ๊ธฐ ์ํด ์ง์ผ์ ธ์ผ ํ๋ ์กฐ๊ฑด
- ์นด์ดํธ ์ํ (
num
๋ณ์์ ๊ฐ)์increase
ํจ์๊ฐ ํธ์ถ๋๊ธฐ ์ ๊น์ง ๋ณ๊ฒฝ๋์ง ์๊ณ ์ ์ง๋์ด์ผ ํ๋ค. - ์นด์ดํธ ์ํ (
num
๋ณ์์ ๊ฐ)์increase
ํจ์๋ง์ด ๋ณ๊ฒฝํ ์ ์์ด์ผ ํ๋ค.
ํ์ง๋ง ์นด์ดํธ ์ํ๋ ์ ์ญ ๋ณ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๊ตฌ๋ ์ ๊ทผ, ๋ณ๊ฒฝ ๊ฐ๋ฅ
๐คฏ ์๋์น ์๊ฒ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์
// ์นด์ดํธ ์ํ ๋ณ๊ฒฝ ํจ์
const increase = function () {
// ์นด์ดํธ ์ํ ๋ณ์
let num = 0;
// ์นด์ดํธ ์ํ๋ฅผ 1๋งํผ ์ฆ๊ฐ ์ํจ๋ค.
return ++num;
};
// ์ด์ ์ํ๋ฅผ ์ ์งํ์ง ๋ชปํ๋ค.
console.log(increase()); // 1
console.log(increase()); // 1
console.log(increase()); // 1
์ ์์ ์์๋ ์ ์ญ ๋ณ์ num
์ increase
ํจ์์ ์ง์ญ ๋ณ์๋ก ๋ฐ๊พธ์ด ์๋์น ์์ ์ํ ๋ณ๊ฒฝ์ ๋ฐฉ์งํด๋ณด์๋ค.
num
๋ณ์์ ์ํ๋ increase
ํจ์๋ง์ด ๋ณ๊ฒฝํ ์ ์๋ค.
console.log ์ ๊ฒฐ๊ณผ๋ ๋ฌด์์ผ๊น? : ๋ชจ๋ 1
console.log ์ ๊ฒฐ๊ณผ๊ฐ์ด ๋ชจ๋ 1์ธ ์ด์ ๋ ๋ฌด์์ผ๊น?
: increase
ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์ง์ญ ๋ณ์ num
์ด ๋ค์ ์ ์ธ, 0์ผ๋ก ์ด๊ธฐํ๋๊ธฐ ๋๋ฌธ
๐คฏ ์ด์ ์ํ๋ฅผ ์ ์งํ์ง ๋ชปํจ
// ์นด์ดํธ ์ํ ๋ณ๊ฒฝ ํจ์
const increase = (function () {
// ์นด์ดํธ ์ํ ๋ณ์
let num = 0;
// ํด๋ก์
return function () {
// ์นด์ดํธ ์ํ๋ฅผ 1๋งํผ ์ฆ๊ฐ ์ํจ๋ค.
return ++num;
};
}());
console.log(increase()); // 1
console.log(increase()); // 2
console.log(increase()); // 3
์ ์์ ์์๋ ์ด์ ์ํ๋ฅผ ์ ์งํ ์ ์๋๋ก ํด๋ก์ ๋ฅผ ์ฌ์ฉํด๋ณด์๋ค.
์ฆ์ ์คํ ํจ์๊ฐ ๋ฐํํ ํด๋ก์ ๋ ์นด์ดํธ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํ ์์ ๋ณ์ num
์ ์ธ์ ์ด๋์ ํธ์ถํ๋ ์ง ์ฐธ์กฐํ๊ณ ๋ณ๊ฒฝ ํ ์ ์๋ค.
ํด๋ก์ ๋ ์ํ state ๊ฐ ์๋์น ์๊ฒ ๋ณ๊ฒฝ๋์ง ์๋๋ก ์์ ํ๊ฒ ์๋ํ๊ณ ํน์ ํจ์์๊ฒ๋ง ์ํ ๋ณ๊ฒฝ์ ํ์ฉํ์ฌ ์ํ๋ฅผ ์์ ํ๊ฒ ์ ์งํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
const counter = (function () {
// ์นด์ดํธ ์ํ ๋ณ์
let num = 0;
// ํด๋ก์ ์ธ ๋ฉ์๋๋ฅผ ๊ฐ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
// ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์ค์ฝํ๋ฅผ ๋ง๋ค์ง ์๋๋ค.
// ๋ฐ๋ผ์ ์๋ ๋ฉ์๋๋ค์ ์์ ์ค์ฝํ๋ ์ฆ์ ์คํ ํจ์์ ๋ ์์ปฌ ํ๊ฒฝ์ด๋ค.
return {
// num: 0, // ํ๋กํผํฐ๋ publicํ๋ฏ๋ก ์๋๋์ง ์๋๋ค.
increase() {
return ++num;
},
decrease() {
return num > 0 ? --num : 0;
}
};
}());
console.log(counter.increase()); // 1
console.log(counter.increase()); // 2
console.log(counter.decrease()); // 1
console.log(counter.decrease()); // 0
์นด์ดํธ ์ํ๋ฅผ ๊ฐ์์ํฌ ์ ์๋๋ก ๋ฐ์ ์ํจ ์ฝ๋์ด๋ค.
increase
, decrease
๋ฉ์๋๋ค์ ์์ ์ค์ฝํ๋ ์ฆ์ ์คํ ํจ์์ ๋ ์์ปฌ ํ๊ฒฝ์ด๋ค.
increase
, decrease
๋ฉ์๋๊ฐ ์ธ์ ์ด๋์ ํธ์ถ๋๋ ์๊ด์์ด increase
, decrease
ํจ์๋ ์ฆ์ ์คํ ํจ์์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
const Counter = (function () {
// โ ์นด์ดํธ ์ํ ๋ณ์
let num = 0;
function Counter() {
// this.num = 0; // โก ํ๋กํผํฐ๋ publicํ๋ฏ๋ก ์๋๋์ง ์๋๋ค.
}
Counter.prototype.increase = function () {
return ++num;
};
Counter.prototype.decrease = function () {
return num > 0 ? --num : 0;
};
return Counter;
}());
const counter = new Counter();
console.log(counter.increase()); // 1
console.log(counter.increase()); // 2
console.log(counter.decrease()); // 1
console.log(counter.decrease()); // 0
์์ฑ์ ํจ์๋ก ํํํ ์ฝ๋์ด๋ค.
์์ฑ์ ํจ์ : ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํน์ํ ํจ์
increase
, decrease
๋ ๋ชจ๋ ์ฆ์ ์คํ ํจ์ ์คํ ์ปจํ
์คํธ์ ๋ ์์ปฌ ํ๊ฒฝ์ ๊ธฐ์ตํ๋ ํด๋ก์ ์ด๋ค.
์ธ๋ถ ์ํ ๋ณ๊ฒฝ์ด๋ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ฅผ ํผํ๊ณ ๋ถ๋ณ์ฑ์ ์งํฅํ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์ ๋ถ์ ํจ๊ณผ๋ฅผ ์ต๋ํ ์ต์ ํ์ฌ ์ค๋ฅ๋ฅผ ํผํ๊ณ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ ๋์ด๊ธฐ ์ํด ํด๋ก์ ๋ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์ ํด๋ก์ ๋ฅผ ์ฌ์ฉํ๋ ์์๋ฅผ ์ดํด๋ณด๋๋ก ํ๋ค.
// makeCounter : ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ๊ณ ํจ์๋ฅผ ๋ฐํํ๋ ๊ณ ์ฐจ ํจ์
// ์ด ํจ์๋ ์นด์ดํธ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํ
// ์์ ๋ณ์ counter๋ฅผ ๊ธฐ์ตํ๋ ํด๋ก์ ๋ฅผ ๋ฐํํ๋ค.
function makeCounter(aux) {
// ์นด์ดํธ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํ ์์ ๋ณ์
let counter = 0;
// ํด๋ก์ ๋ฅผ ๋ฐํ : ์์ ์ด ์์ฑ๋์ ๋์ ๋ ์์ปฌ ํ๊ฒฝ์ธ
// makeCounter ํจ์์์ค์ฝํ์ ์ํ counter ๋ณ์๋ฅผ ๊ธฐ์ตํ๋ค.
return function () {
// ์ธ์๋ก ์ ๋ฌ ๋ฐ์ ๋ณด์กฐ ํจ์์ ์ํ ๋ณ๊ฒฝ์ ์์ํ๋ค.
counter = aux(counter);
return counter;
};
}
// ๋ณด์กฐ ํจ์
function increase(n) {
return ++n;
}
// ๋ณด์กฐ ํจ์
function decrease(n) {
return --n;
}
// ํจ์๋ก ํจ์๋ฅผ ์์ฑํ๋ค.
// makeCounter ํจ์๋ ๋ณด์กฐ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ํจ์๋ฅผ ๋ฐํํ๋ค
const increaser = makeCounter(increase); // โ
console.log(increaser()); // 1
console.log(increaser()); // 2
// increaser ํจ์์๋ ๋ณ๊ฐ์ ๋
๋ฆฝ๋ ๋ ์์ปฌ ํ๊ฒฝ์ ๊ฐ๊ธฐ ๋๋ฌธ์ ์นด์ดํฐ ์ํ๊ฐ ์ฐ๋ํ์ง ์๋๋ค.
const decreaser = makeCounter(decrease); // โก
console.log(decreaser()); // -1
console.log(decreaser()); // -2
makeCounter
ํจ์๋ฅผ ํธ์ถํด ํจ์๋ฅผ ๋ฐํํ ๋ ๋ฐํ๋ ํจ์๋ ์์ ๋ง์ ๋
๋ฆฝ๋ ๋ ์์ปฌ ํ๊ฒฝ์ ๊ฐ์ง๋ค. ํจ์๋ฅผ ํธ์ถํ๋ฉด ๊ทธ๋๋ง๋ค ์๋ก์ด makeCounter
ํจ์ ์คํ ์ปจํ
์คํธ์ ๋ ์์ปฌ ํ๊ฒฝ์ด ์์ฑ๋๊ธฐ ๋๋ฌธ์ด๋ค.
โ makeCounter
ํจ์ ํธ์ถ - makeCounter
ํจ์์ ์คํ ์ปจํ
์คํธ ์์ฑ - ํจ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋ฐํ - ์๋ฉธ
makeCounter
ํจ์์ ์คํ ์ปจ์ผ์คํธ๋ ์๋ฉธ๋์ง๋ง ๋ ์์ปฌ ํ๊ฒฝ์ ์ฐธ์กฐ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ์๋ฉธ๋์ง ์๋๋ค.
โก ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์คํ๋๊ณ , ์ฐธ์กฐ๋ ํ๊ฒฝ์ ์๋ฉธ๋์ง ์๋๋ค.
์ด ์์์์ ์ ์ญ ๋ณ์ increaser
๊ณผ decreaser
์ ํ ๋น๋ ํจ์๋ ๊ฐ๊ฐ ์์ ๋ง์ ๋
๋ฆฝ๋ ๋ ์์ปฌ ํ๊ฒฝ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ์นด์ดํธ๋ฅผ ์ ์งํ๊ธฐ ์ํ counter
๋ฅผ ๊ณต์ ํ์ง ์์ ์ซ์์ ์ฆ๊ฐ ๊ฐ์๊ฐ ์ฐ๋๋์ง ์๋๋ค.
// ํจ์๋ฅผ ๋ฐํํ๋ ๊ณ ์ฐจ ํจ์
// ์ด ํจ์๋ ์นด์ดํธ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํ ์์ ๋ณ์ counter๋ฅผ ๊ธฐ์ตํ๋ ํด๋ก์ ๋ฅผ ๋ฐํํ๋ค.
const counter = (function () {
// ์นด์ดํธ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํ ์์ ๋ณ์
let counter = 0;
// ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ๋ ํด๋ก์ ๋ฅผ ๋ฐํ
return function (aux) {
// ์ธ์๋ก ์ ๋ฌ ๋ฐ์ ๋ณด์กฐ ํจ์์ ์ํ ๋ณ๊ฒฝ์ ์์ํ๋ค.
counter = aux(counter);
return counter;
};
}());
// ๋ณด์กฐ ํจ์
function increase(n) {
return ++n;
}
// ๋ณด์กฐ ํจ์
function decrease(n) {
return --n;
}
// ๋ณด์กฐ ํจ์๋ฅผ ์ ๋ฌํ์ฌ ํธ์ถ
console.log(counter(increase)); // 1
console.log(counter(increase)); // 2
// ์์ ๋ณ์๋ฅผ ๊ณต์ ํ๋ค.
console.log(counter(decrease)); // 1
console.log(counter(decrease)); // 0
๋ ์์ปฌ ํ๊ฒฝ์ ๊ณต์ ํ๋ ํด๋ก์ ๋ฅผ ๋ง๋ค๊ธฐ ์ํด makeCounter
ํจ์๋ฅผ ๋ ๋ฒ ํธ์ถํ์ง ์๋ ์ฝ๋์ด๋ค.
์ฆ์ ์คํ ํจ์ ๋ด๋ถ์์ counter
๋ผ๋ ํด๋ก์ ๋ฅผ ์ ์ํ๊ณ , ํด๋น ํด๋ก์ ๋ฅผ ๋ฐํํ๋ค. ์ด๋ ๊ฒ ๋ฐํ๋ ํด๋ก์ ๋ ์ธ์๋ก ์ ๋ฌ๋ ๋ณด์กฐ ํจ์์ ์ํ ๋ณ๊ฒฝ์ ์์ํ๋ฉฐ, ์์ ๋ณ์์ธ counter
์ ๊ณต์ ํ๋ค.
์ฆ์ ์คํ ํจ์ ๋ด๋ถ์์ ์์ฑ๋ ๋จ์ผํ ํด๋ก์ ๋ง์ ์ฌ์ฉํ์ฌ ์นด์ดํฐ ์ํ๋ฅผ ์ ์งํ๋ค. ๊ฐ์ ํด๋ก์ ์ ๋ํด ์ฌ๋ฌ ๋ฒ ํธ์ถํ๋ ๊ฒฝ์ฐ, ๋ณด์กฐ ํจ์์ ์ํด ๋ณ๊ฒฝ๋ ์นด์ดํฐ ๊ฐ์ด ๊ณ์ํด์ ์ ์ง๋๋ค.
์บก์ํ : ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ํ๋ด๋ ํ๋กํผํฐ์ ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๊ณ ์กฐ์ํ ์ ์๋ ๋์์ธ ๋ฉ์๋๋ฅผ ํ๋๋ก ๋ฌถ๋ ๊ฒ
์ ๋ณด ์๋ : ๊ฐ์ฒด์ ํน์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ถ๋ ๊ฒ
์บก์ํ ํ๋ ์ด์ : 1. ๊ฐ์ฒด ๊ฐ์ ์ํธ ์์กด์ฑ = ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ค. : 2. ์ธ๋ถ์ ๊ตฌํ์ ์ผ๋ถ๋ฅผ ๊ณต๊ฐ๋์ง ์๋๋ก ๊ฐ์ถ์ด ์ ์ ์น ๋ชปํ ์ ๊ทผ์ผ๋ก๋ถํฐ ๊ฐ์ฒด์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋ฐฉ์งํด ์ ๋ณด๋ฅผ ๋ณดํธํ๋ค.
๊ฐ์ฒด์ ๋ชจ๋ ํ๋กํผํฐ์ ๋ฉ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก public ํ๋ค.
function Person(name, age) {
this.name = name; // public
let _age = age; // private
// ์ธ์คํด์ค ๋ฉ์๋
this.sayHi = function () {
console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
};
}
const me = new Person('Lee', 20);
me.sayHi(); // Hi! My name is Lee. I am 20.
console.log(me.name); // Lee
console.log(me._age); // undefined
const you = new Person('Kim', 30);
you.sayHi(); // Hi! My name is Kim. I am 30.
console.log(you.name); // Kim
console.log(you._age); // undefined
name
ํ๋กํผํฐ๋ ์์ฑ์ ํจ์ ๋ด๋ถ์์ ์ธ์คํด์ค ๊ฐ์ฒด์ ๋์ ์ผ๋ก ์์ฑ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ด๊ณ , public ํด์ ์์ ๋กญ๊ฒ ์ฐธ์กฐ, ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค.
_age
๋ณ์๋ Person
์์ฑ์ ํจ์์ ์ง์ญ ๋ณ์์ฌ์ Person
์์ฑ์ ํจ์ ์ธ๋ถ์์ ์ฐธ์กฐ, ๋ณ๊ฒฝํ ์ ์๋ค. = private ํ๋ค.
function Person(name, age) {
this.name = name; // public
let _age = age; // private
}
// ํ๋กํ ํ์
๋ฉ์๋
Person.prototype.sayHi = function () {
// Person ์์ฑ์ ํจ์์ ์ง์ญ ๋ณ์ _age๋ฅผ ์ฐธ์กฐํ ์ ์๋ค
console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
};
sayHi
๋ฉ์๋๋ฅผ ํ๋กํ ํ์
๋ฉ์๋๋ก ๋ณ๊ฒฝํ์ฌ sayHi
๋ฉ์๋์ ์ค๋ณต ์์ฑ์ ๋ฐฉ์งํ ์ฝ๋์ด๋ค.
Person.prototype.sayHi
๋ฉ์๋ ๋ด์์ Person
์์ฑ์ ํจ์์ ์ง์ญ ๋ณ์ _age
๋ฅผ ์ฐธ์กฐํ ์ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
const Person = (function () {
let _age = 0; // private
// ์์ฑ์ ํจ์
function Person(name, age) {
this.name = name; // public
_age = age;
}
// ํ๋กํ ํ์
๋ฉ์๋
Person.prototype.sayHi = function () {
console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
};
// ์์ฑ์ ํจ์๋ฅผ ๋ฐํ
return Person;
}());
const me = new Person('Lee', 20);
me.sayHi(); // Hi! My name is Lee. I am 20.
console.log(me.name); // Lee
console.log(me._age); // undefined
const you = new Person('Kim', 30);
you.sayHi(); // Hi! My name is Kim. I am 30.
console.log(you.name); // Kim
console.log(you._age); // undefined
์ฆ์ ์คํ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ Person
์์ฑ์ ํจ์์ Person.prototype.sayHi
๋ฉ์๋๋ฅผ ํ๋์ ํจ์ ๋ด์ ๋ชจ์ ์ฝ๋์ด๋ค.
Person.prototype.sayHi
๋ ์ฆ์ ์คํ ํจ์๊ฐ ์ข
๋ฃ๋ ์ดํ ํธ์ถ๋๋ค.
Person
์์ฑ์ ํจ์์ sayHi
๋ฉ์๋๋ ์ด๋ฏธ ์ข
๋ฃ๋์ด ์๋ฉธํ ์ฆ์ ์คํ ํจ์์ ์ง์ญ ๋ณ์ _age
๋ฅผ ์ฐธ์กฐํ ์ ์๋ ํด๋ก์ ์ด๋ค.
Person
์์ฑ์ ํจ์๊ฐ ์ฌ๋ฌ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๊ฒฝ์ฐ _age
๋ณ์์ ์ํ๊ฐ ์ ์ง๋์ง ์๋๋ค.
const me = new Person('Lee', 20);
me.sayHi(); // Hi! My name is Lee. I am 20.
const you = new Person('Kim', 30);
you.sayHi(); // Hi! My name is Kim. I am 30.
// _age ๋ณ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค!
me.sayHi(); // Hi! My name is Lee. I am 30.
์๋ก์ด Person
์ธ์คํด์ค๋ฅผ ์์ฑํ ๋๋ง๋ค _age
๊ฐ์ด ๋ณ๊ฒฝ๋๋ค. ๋ง์ง๋ง์ผ๋ก ์์ฑ๋ ์ธ์คํด์ค์ ๋์ด (_age
)๊ฐ ์ด์ ๋ชจ๋ ์ธ์คํด์ค์ ๋์ด๋ก ์ค์ ๋๋ค.
_age
๋ณ์๊ฐ ๋ชจ๋ ์ธ์คํด์ค ๊ฐ์ ๊ณต์ ๋์ด์ ๋ง์ง๋ง์ผ๋ก ์์ฑ๋ you
๊ฐ์ฒด์ ๋์ด(30)๊ฐ ์ด์ ์ ๋ง๋ค์ด์ง me
๊ฐ์ฒด์ ๋์ด(20)๋ฅผ ๋ฎ์ด์ด ๊ฒ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ ๋ณด ์๋์ ์์ ํ๊ฒ ์ง์ํ์ง ์๋๋ค. ์ธ์คํด์ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๋ณ์๋ฅผ ํตํด ํ๋ด ๋ผ ์์ ์์ง๋ง ํ๋กํ ํ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถ๊ฐ๋ฅํ๋ค.
ํด๋์ค์ private ํ๋๋ฅผ ์ ์ํ ์ ์๋ ์๋ก์ด ํ์ค ์ฌ์์ด ์ ์๋์ด ์๋ค. 25.7.4์ ์์ ์์ธํ ๋ณผ ์ ์๋ค.
var funcs = [];
for (var i = 0; i < 3; i++) {
funcs[i] = function () { return i; }; // โ
}
for (var j = 0; j < funcs.length; j++) {
console.log(funcs[j]()); // โก
}
์ด๋ค ๊ฐ์ด ์ถ๋ ฅ๋ ๊น์? 3, 3, 3
์ฐ๋ฆฌ๊ฐ ์์ํ ๊ฒฐ๊ณผ๋? 0, 1, 2
๋ฌธ์ ์ ์์ธ์ด ๋ฌด์์ผ๊น์? ํด๋ก์ ์ ๋ณ์ ์ค์ฝํ
โ ์์ ์ต๋ช
ํจ์๊ฐ ์์ฑ๋ ๋ ๊ทธ ํจ์๋ i
์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋ค. for ๋ฃจํ๊ฐ ๋๋ ํ์ i
๊ฐ์ 3
์ด๋ค. funcs
๋ฐฐ์ด ์์ ๋ชจ๋ ํจ์๋ค์ด ๋์ผํ i ( 3 )๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋ฏ๋ก ๋ชจ๋ ํจ์ ํธ์ถ ๊ฒฐ๊ณผ๊ฐ 3
์ด ๋๋ค.
var funcs = [];
for (var i = 0; i < 3; i++){
funcs[i] = (function (id) { // โ
return function () {
return id;
};
}(i));
}
for (var j = 0; j < funcs.length; j++) {
console.log(funcs[j]());
}
ํด๋ก์ ๋ฅผ ์ฌ์ฉํด ๋ฐ๋ฅด๊ฒ ๋์ํ๋ ์ฝ๋๋ก ๋ง๋ค์ด๋ณด์๋ค.
ํด๋ก์ ์ ์ฆ์ ์คํ ํจ์ ํํ์์ ์ฌ์ฉํ์ฌ ๊ฐ ํจ์๊ฐ ์์ ๋ง์ ๊ณ ์ ํ i
๊ฐ์ ๊ฐ์ง๋๋ก ํ๋ค.
- โ ์์ ๊ฐ ๋ฐ๋ณต๋ง๋ค ์ฆ์ ์คํ ํจ์ ํํ์์ด ํธ์ถ๋๋ค.
- ์ด ํจ์๋ ๋ค์ ๋ด๋ถ์ ์๋ ์ต๋ช ํจ์๋ฅผ ๋ฐํํ๋ค.
- ๋ฐํ๋ ํจ์๊ฐ ๊ฐ๊ฐ์
funcs[i]
์ ์ ์ฅ๋๋ค.
- ๋ฐํ๋ ์ต๋ช
ํจ์๊ฐ ์ฆ์ ์คํ ํจ์์ ์ค์ฝํ์์ ์์ฑ๋์๊ธฐ ๋๋ฌธ์, ํด๋น ์ค์ฝํ ๋ด๋ถ์ ๋ณ์์ธ
id
๋ฅผ ๊ณ์ ์ฐธ์กฐํ๊ฒ ๋๋ค. = ํด๋ก์ ๊ฐ ํ์ฑ๋๋ค.
funcs[i]
์ ์ ์ฅ๋ ํจ์๋ ์์ ๋ง์ ๊ณ ์ ํid
๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค.- ์๋ ๊ธฐ๋ํ ๊ฒฐ๊ณผ์ธ
'0', '1', '2'
์ถ๋ ฅ
let
ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ ํ๊ฒฝ์์ for ๋ฃจํ์ ํด๋ก์ ๋ฅผ ํจ๊ป ์ฌ์ฉํ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด๋ค.
const funcs = [];
for (let i = 0; i < 3; i++) { โ
funcs[i] = function () { return i; };
}
for (let i = 0; i < funcs.length; i++) {
console.log(funcs[i]()); // 0 1 2
}
๊ทธ๋ฅ let
ํค์๋๋ฅผ ์ฐ๋ฉด ๊ฐ๋จํ๊ฒ ํด๊ฒฐ ๊ฐ๋ฅํ๋ค.
- โ ์์, ๊ฐ ๋ฐ๋ณต๋ง๋ค
let i = 0;
๊ตฌ๋ฌธ์ ์ํด ์๋ก์ดi
๋ณ์๊ฐ ์ ์ธ๋๊ณ ์ด๊ธฐํ๋๋ค. ์ด๋let
ํค์๋๋ ๋ธ๋ก ์ค์ฝํ(block scope)๋ฅผ ๊ฐ์ง๋ฏ๋ก, ๊ฐ ๋ฐ๋ณต๋ง๋ค ์๋ก์ด ์ค์ฝํ๊ฐ ํ์ฑ๋ฉ๋๋ค. - ์ต๋ช
ํจ์
function () { return i; }
๊ฐ ์์ฑ๋์ดfuncs[i]
์์น์ ์ ์ฅ๋๋ค. ์ด ํจ์๋ ์์ ์ ์์ฑํ ์ค์ฝํ์ ๋ณ์์ธi
์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋ค. = ํด๋ก์ ๊ฐ ํ์ฑ๋๋ค. - ๊ฐ ๋ฐ๋ณต๋ง๋ค ์๋กญ๊ฒ ์ ์ธ๋
i
๋๋ฌธ์ ๊ฐ๊ฐ์ ํด๋ก์ (์ต๋ช ํจ์)๋ ์๋ก ๋ค๋ฅธi
๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋ค. - ์๋ ๊ธฐ๋ํ ๊ฒฐ๊ณผ์ธ
'0', '1', '2'
์ถ๋ ฅ
let
์ด๋ const
ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐ๋ณต๋ฌธ์ ์ฝ๋ ๋ธ๋ก์ ๋ฐ๋ณต ์คํํ ๋๋ง๋ค ์๋ก์ด ๋ ์์ปฌ ํ๊ฒฝ์ ์์ฑํ์ฌ ๋ฐ๋ณตํ ๋น์์ ์ํ๋ฅผ ๋ง์น ์ค๋
์ท์ฒ๋ผ ์ ์ฅํ๋ค. ๋ฐ๋ณต๋ฌธ์ ์ฝ๋ ๋ธ๋ก ๋ด๋ถ์์ ํจ์๋ฅผ ์ ์ํ ๋ ์๋ฏธ๊ฐ ์๋ค.
// ์์๊ฐ 3๊ฐ์ธ ๋ฐฐ์ด์ ์์ฑํ๊ณ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ์์๋ก ์ถ๊ฐํ๋ค.
// ๋ฐฐ์ด์ ์์๋ก ์ถ๊ฐ๋ ํจ์๋ค์ ๋ชจ๋ ํด๋ก์ ๋ค.
const funcs = Array.from(new Array(3), (_, i) => () => i); // (3) [ฦ, ฦ, ฦ]
// ๋ฐฐ์ด์ ์์๋ก ์ถ๊ฐ๋ ํจ์ ๋ค์ ์์ฐจ์ ์ผ๋ก ํธ์ถํ๋ค.
funcs.forEach(f => console.log(f())); // 0 1 2
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ธ ๊ณ ์ฐจ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์๋ค. ์์ง ์ดํด๋ณด์ง ์์ ๋ด์ฉ์ด๋ ์์๋ง ๋๋๊ฒ ์ข๊ฒ ๋ค.!!