๐ 24์ฅ, ํด๋ก์
๐ ๋ฐฐ์ด ๋ด์ฉ ๋ฐ ๊ธฐ์ตํ๊ณ ์ถ์ ๋ด์ฉ
ํด๋ก์ ๋ ํจ์๋ฅผ ์ผ๊ธ ๊ฐ์ฒด๋ฅผ ์ทจ๊ธํ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฌ์ฉ๋๋ ์ค์ํ ํน์ฑ์ด๋ค.
MDN์์ ํด๋ก์ ์ ์ ์
ํด๋ก์ ๋ ํจ์์ ๊ทธ ํจ์๊ฐ ์ ์ธ๋ ๋ ์์ปฌ ํ๊ฒฝ๊ณผ์ ์กฐํฉ์ด๋ค.
โ๊ทธ ํจ์๊ฐ ์ ์ธ๋ ๋ ์์ปฌ ํ๊ฒฝโ: ์์ ์ค์ฝํ๊ฐ ์๋ฏธํ๋ ์คํ ์ปจํ ์คํธ์ ๋ ์์ปฌ ํ๊ฒฝ์ ์๋ฏธ
1. ๋ ์์ปฌ ์ค์ฝํ
- ๋ ์์ปฌ ์ค์ฝํ(์ ์ ์ค์ฝํ): ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์์ ํจ์๋ฅผ ์ด๋์ ์ ์ํ๋์ง์ ๋ฐ๋ผ ์์์ค์ฝํ๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ
- ์ค์ฝํ ์ฒด์ธ: ๋ ์์ปฌ ํ๊ฒฝ์์ โ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ์ ๋ํ ์ฐธ์กฐโ๋ฅผ ํตํด ์์ ๋ ์์ปฌ ํ๊ฒฝ๊ณผ ์ฐ๊ฒฐ๋๋ ๊ฒ
- ํจ์์ ์์ ์ค์ฝํ๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ === โ๋ ์์ปฌ ํ๊ฒฝ์ ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ์ ๋ํ ์ฐธ์กฐ์ ์ ์ฅํ ์ฐธ์กฐ๊ฐ์ ๊ฒฐ์ ํ๋ ๊ฒโ
๋ ์์ปฌ ์ค์ฝํ: ์์ ์ค์ฝํ์ ๋ํ ์ฐธ์กฐ๋ ํจ์๊ฐ ์ ์๋๋ ์์ ์ ํจ์๊ฐ ์ ์๋ ํ๊ฒฝ์ ์ํด ๊ฒฐ์ ๋๋ ๊ฒ
2. ํจ์ ๊ฐ์ฒด์ ๋ด๋ถ ์ฌ๋กฏ [[Environment]]
๋ ์์ปฌ ์ค์ฝํ๊ฐ ๊ฐ๋ฅํ๋ ค๋ฉด ์์์ค์ฝํ๋ฅผ ๊ธฐ์ตํด์ผํ๋ค(ํจ์ ์ ์๊ฐ ์์นํ๋ ์ค์ฝํ)
ํจ์๋ ์์ ์ ๋ด๋ถ ์ฌ๋กฏ [[Environment]] ์ ์์ ์ด ์ ์๋ ํ๊ฒฝ, ์ฆ ์์ ์ค์ฝํ์ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๋ค
๋ฐ๋ผ์ ํจ์ ๊ฐ์ฒด์ ๋ด๋ถ ์ฌ๋กฏ [[Enviroment]]์ ์ ์ฅ๋ ํ์ฌ ์คํ ์ค์ธ ์คํ ์ปจํ ์คํธ์ ๋ ์์ปฌ ํ๊ฒฝ์ ์ฐธ ์กฐ๊ฐ ๋ฐ๋ก ์์ ์ค์ฝํ๋ค
์์ ์ด ํธ์ถ๋์์ ๋ ์์ฑ๋ ํจ์ ๋ ์์ปฌ ํ๊ฒฝ์ โ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ์ ๋ํ ์ฐธ์กฐโ์ ์ ์ฅ๋ ์ฐธ์กฐ๊ฐ์ด๋ค. ํจ์ ๊ฐ์ฒด๋ ๋ด๋ถ ์ฌ๋กฏ [[envirorment]]์ ์ ์ฅํ ๋ ์์ปฌ ํ๊ฒฝ์ ์ฐธ์กฐ. ์ฆ ์์ ์ค์ฝํ๋ฅผ ์์ ์ด ์กด์ฌํ๋ ํ ๊ธฐ์ตํ๋ค
์ฝ๋ ์์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const x = 1;
function foo() {
const x = 10;
// ์์ ์ค์ฝํ๋ ํจ์ ์ ์ ํ๊ฒฝ(์์น)์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค.
// ํจ์ ํธ์ถ ์์น์ ์์ ์ค์ฝํ๋ ์๋ฌด๋ฐ ๊ด๊ณ๊ฐ ์๋ค.
bar();
}
// ํจ์ bar๋ ์์ ์ ์์ ์ค์ฝํ, ์ฆ ์ ์ญ ๋ ์์ปฌ ํ๊ฒฝ์ [[Environment]]์ ์ ์ฅํ์ฌ ๊ธฐ์ตํ๋ค.
function bar() {
console.log(x);
}
foo(); // ?
bar(); // ?
๋ ์์ปฌ ์ค์ฝํ๋ ํจ์๊ฐ ์ด๋์ ์ ์๋๋์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ ์ค์ฝํ๋ฅผ ์ ํ๋ฏ๋ก foo()์ ์์์ค์ฝํ๋ ์ ์ญ ๋ ์์ปฌ ํ๊ฒฝ์ด๋ฉฐ bar()์ ์์์ค์ฝํ๋ ์ ์ญ ๋ ์์ปฌ ํ๊ฒฝ์ด๋ค.
3. ํด๋ก์ ์ ๋ ์์ปฌ ํ๊ฒฝ
์ฝ๋ ์์
1
2
3
4
5
6
7
8
9
10
11
12
13
const x = 1;
// โ
function outer() {
const x = 10; // ์์ ๋ณ์ x
const inner = function () { console.log(x); }; // โก
return inner;
}
// outer ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ค์ฒฉ ํจ์ inner๋ฅผ ๋ฐํํ๋ค.
// ๊ทธ๋ฆฌ๊ณ outer ํจ์์ ์คํ ์ปจํ
์คํธ๋ ์คํ ์ปจํ
์คํธ ์คํ์์ ํ๋์ด ์ ๊ฑฐ๋๋ค.
const innerFunc = outer(); // โข
innerFunc(); // โฃ 10
inner ํจ์๋ ์์ ์ด ํ๊ฐ๋ ๋ ์์ ์ด ์ ์๋ ์์น์ ์ํด ๊ฒฐ์ ๋ ์์ ์ค์ฝํ๋ฅผ [[Environment]] ๋ด๋ถ ์ฌ๋กฏ์ ์ ์ฅํ๋ค.
์ ์ฅ๋ ์์ ์ค์ฝํ๋ ํจ์๊ฐ ์กด์ฌํ๋ ํ ์ ์ง๋๋ค.
ํด๋ก์ (Closure): ์ธ๋ถ ํจ์ ๋ณด๋ค ์ค์ฒฉ ํจ์๊ฐ ๋ ์ค๋ ์ ์ง๋๋ ๊ฒฝ์ฐ ์ค์ฒฉ ํจ์๋ ์ด๋ฏธ ์๋ช ์ฃผ๊ธฐ๊ฐ ์ข ๋ฃ๋ ์ธ๋ถ ํจ์์ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ ๊ฒ
ํด๋ก์ ๋ ์ค์ฒฉ ํจ์๊ฐ ์์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ณ ์ค์ฒฉ ํจ์๊ฐ ์ธ๋ถ ํจ์๋ณด๋ค ๋ ์ ์ง๋๋ ๊ฒฝ์ฐ์ ํ์ ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
ํด๋ก์ === โ์์ ๋ณ์์ ๋ฌถ์ฌ ์๋ ํจ์โ
4. ํด๋ก์ ์ ํ์ฉ
ํด๋ก์ ๋ ์ํ๋ฅผ ์์ ํ๊ฒ ๋ณ๊ฒฝํ๊ณ ์ ์งํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ์ฆ, ์ํ๊ฐ ์๋์น์๊ฒ ๋ณ๊ฒฝ๋์ง ์๋๋ก ์ํ๋ฅผ ์์ ํ๊ฒ ์๋ํ๊ณ ํน์ ํจ์์๊ฒ๋ง ์ํ ๋ณ๊ฒฝ์ ํ์ฉํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
ํด๋ก์ ์ ์ข์ง ์์ ์์ ์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
// ์นด์ดํธ ์ํ ๋ณ์
let num = 0;
// ์นด์ดํธ ์ํ ๋ณ๊ฒฝ ํจ์
const increase = function () {
// ์นด์ดํธ ์ํ๋ฅผ 1๋งํผ ์ฆ๊ฐ ์ํจ๋ค.
return ++num;
};
console.log(increase()); // 1
console.log(increase()); // 2
console.log(increase()); // 3
ํด๋ก์ ์ ์ข์ ์์ ์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// ์นด์ดํธ ์ํ ๋ณ๊ฒฝ ํจ์
const increase = (function () {
// ์นด์ดํธ ์ํ ๋ณ์
let num = 0;
// ํด๋ก์
return function () {
// ์นด์ดํธ ์ํ๋ฅผ 1๋งํผ ์ฆ๊ฐ ์ํจ๋ค.
return ++num;
};
}());
console.log(increase()); // 1
console.log(increase()); // 2
console.log(increase()); // 3
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํด๋ก์ ํ์ฉ ์์ ์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ๊ณ ํจ์๋ฅผ ๋ฐํํ๋ ๊ณ ์ฐจ ํจ์
// ์ด ํจ์๋ ์นด์ดํธ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํ ์์ ๋ณ์ counter๋ฅผ ๊ธฐ์ตํ๋ ํด๋ก์ ๋ฅผ ๋ฐํํ๋ค.
function makeCounter(aux) {
// ์นด์ดํธ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํ ์์ ๋ณ์
let counter = 0;
// ํด๋ก์ ๋ฅผ ๋ฐํ
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 ํจ์์ ์ค์ฝํ์ ์ํ counter ๋ณ์๋ฅผ ๊ธฐ์ตํ๋ ํด๋ก์ ๋ค.
makeCounter ํจ์๋ฅผ ํธ์ถํด ํจ์๋ฅผ ๋ฐํํ ๋ ๋ฐํ๋ ํจ์๋ ์์ ๋ง์ ๋ ๋ฆฝ๋ ๋ ์์ปฌ ํ๊ฒฝ์ ๊ฐ๋๋ค.
์ด ์์ ๋ ๊ฐ๊ฐ ์์ ๋ง์ ๋ ๋ฆฝ๋ ๋ ์์ปฌ ํ๊ฒฝ์ ๊ฐ๊ธฐ ๋๋ฌธ์ ์นด์ดํฐ๋ฅผ ์ ์งํ๊ธฐ ์ํ ์์ ๋ณ์ counter๋ฅผ ๊ณต์ ํ์ง ์์ ์นด์ดํฐ ์ฆ๊ฐ์ด ์ฐ๋๋์ง ์๋๋ค.
๋ ์์ปฌ ํ๊ฒฝ์ ๊ณต์ ํ๋ ํด๋ก์ ํ์ฉ ์์ ์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// ํจ์๋ฅผ ๋ฐํํ๋ ๊ณ ์ฐจ ํจ์
// ์ด ํจ์๋ ์นด์ดํธ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํ ์์ ๋ณ์ 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
5. ์บก์ํ์ ์ ๋ณด ์๋
์บก์ํ(encapsulation): ์ํ์ ๋์์ ํ๋๋ก ๋ฌถ๋ ๊ฒ์ ์๋ฏธ
์บก์ํ๋ ๊ฐ์ฒด์ ํน์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ถ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ === ์ ๋ณด ์๋
์ ๋ณด ์๋์ ์ธ๋ถ์ ๊ณต๊ฐํ ํ์๊ฐ ์๋ ๊ตฌํ์ ์ผ๋ถ๋ฅผ ์ธ๋ถ์ ๊ณต๊ฐ๋์ง ์๋๋ก ๊ฐ์ถ์ด ์ ์ ์น ๋ชปํ ์ ๊ทผ์ผ๋ก๋ถํฐ ๊ฐ์ฒด์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋ฐฉ์งํด ๋ณดํธํ๊ณ ๊ฐ์ฒด๊ฐ์ ์ํธ์์กด์ฑ์ธ ๊ฒฐํฉ๋(coupling)๋ฅผ ๋ฎ์ถ๋ ํจ๊ณผ๊ฐ ์๋ค.
์์ ์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
_age ๋ณ์๋ privateํ๋ค.
์ ์์ ๋ Person ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋๋ง๋ค sayHi ๋ฉ์๋๊ฐ ์ค๋ณต์์ฑ๋๋ค.
๋ฉ์๋์ ์ค๋ณต ์์ฑ์ด ๋์ง์์ ์์ ์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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.prototype.sayHi ๋ฉ์๋๋ ์ฆ์ ์คํ ํจ์๊ฐ ์ข ๋ฃ๋ ์ดํ ํธ์ถ๋๋ค.
ํด๋ก์ ์ด๊ธฐ ๋๋ฌธ์ _age๋ฅผ ์ฐธ์กฐ ํ ์ ์๋ค.
์ ์์ ๋ _age ๋ณ์์ ์ํ๊ฐ ์ ์ง๋์ง ์๋๋ค. Person.prototype.sayHi ๋ฉ์๋๊ฐ ๋จ ํ ๋ฒ ์์ฑ๋๋ ํด๋ก์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์์ ํ ์ ๋ณด ์๋์ ์ง์ํ์ง ์๋๋ค.
6. ์์ฃผ ๋ฐ์ํ๋ ์ค์
ํด๋ก์ ์ค์ ์์ ์ฝ๋
1
2
3
4
5
6
7
8
9
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]()); // โก
}
0, 1, 2๊ฐ ๋ฐํ ๋์ง์๊ณ 3, 3, 3์ด ์ถ๋ ฅ๋๋ค.
for ๋ฌธ์ ๋ณ์ ์ ์ธ๋ฌธ์์ var ํค์๋๋ฅผ ์ฌ์ฉํ i ๋ณ์๋ ์ ์ญ ๋ณ์์ด๋ค. ์ ์ญ ๋ณ์ i์๋ 0, 1, 2๊ฐ ์์ฐจ์ ์ผ๋ก ํ ๋น๋๋ค. ๋ฐ๋ผ์ funcs ๋ฐฐ์ด์ ์์๋ก ์ถ๊ฐํ ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ ์ญ ๋ณ์ i๋ฅผ ์ฐธ์กฐํ์ฌ i์ ๊ฐ์ 3์ด ์ถ๋ ฅ๋๋ ๊ฒ์ด๋ค.
ํด๋ก์ ๋ฅผ ์ฌ์ฉํ ์ฌ๋ฐ๋ฅธ ์์ ์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
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]());
}
์ฆ์ ์คํ ํจ์์ ๋งค๊ฐ๋ณ์ id๋ ์ฆ์ ์คํ ํจ์๊ฐ ๋ฐํํ ์ค์ฒฉ ํจ์์ ์์ ์ค์ฝํ์ ์กด์ฌํ๋ค.
for ๋ฌธ์ ๋ณ์ ์ ์ธ๋ฌธ์์ var ํค์๋๋ก ์ ์ธํ ๋ณ์๊ฐ ์ ์ญ๋ณ์๊ฐ ๋์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
ํด๋ก์ ์ let ํค์๋๋ฅผ ์ฌ์ฉํ ์ฌ๋ฐ๋ฅธ ์์ ์ฝ๋
1
2
3
4
5
6
7
8
9
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
}
for ๋ฌธ์ ๋ณ์ ์ ์ธ๋ฌธ์์ let ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด for ๋ฌธ์ ์ฝ๋ ๋ธ๋ก์ด ๋ฐ๋ณต ์คํ๋ ๋ ๋ง๋ค for ๋ฌธ ์ฝ๋ ๋ธ๋ก์ ์๋ก์ด ๋ ์์ปฌ ํ๊ฒฝ์ด ์์ฑ๋๋ค.
for ๋ฌธ์ด ๋ฐ๋ณต๋ ๋๋ง๋ค ๋ ๋ฆฝ์ ์ธ ๋ ์์ปฌ ํ๊ฒฝ์ ์์ฑํ์ฌ ์๋ณ์์ ๊ฐ์ ์ ์งํ๋ค.
์ฝ๋ ๋ธ๋ก ๋ด์์ ํจ์๋ฅผ ์ ์ํ ๋ ์๋ฏธ๊ฐ ์๋ค.
๊ณ ์ฐจํจ์๋ฅผ ์ฌ์ฉํ ์์ ์ฝ๋
1
2
3
4
5
6
// ์์๊ฐ 3๊ฐ์ธ ๋ฐฐ์ด์ ์์ฑํ๊ณ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ์์๋ก ์ถ๊ฐํ๋ค.
// ๋ฐฐ์ด์ ์์๋ก ์ถ๊ฐ๋ ํจ์๋ค์ ๋ชจ๋ ํด๋ก์ ๋ค.
const funcs = Array.from(new Array(3), (_, i) => () => i); // (3) [ฦ, ฦ, ฦ]
// ๋ฐฐ์ด์ ์์๋ก ์ถ๊ฐ๋ ํจ์ ๋ค์ ์์ฐจ์ ์ผ๋ก ํธ์ถํ๋ค.
funcs.forEach(f => console.log(f())); // 0 1 2
๋ณ์์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉ์ ์ต์ ํ์ฌ ์ค๋ฅ๋ฅผ ์ค์ด๊ณ ๊ฐ๋ ์ฑ์ ์ข๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ธ ๊ณ ์ฐจํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํผ ์์ ์ฝ๋์ด๋ค.
โ๏ธ ์ฝ์ ์๊ฐ
ํด๋ก์ ๋ MDN์์ โํจ์์ ๊ทธ ํจ์๋ฅผ ํธ์ถํ๋ ๋ ์์ปฌ ํ๊ฒฝโ์ ์๋ฏธํ๋ค๊ณ ์ด์ผ๊ธฐํ๋ค. ์ฒ์์๋ ์ด ๋ง์ด ๋ฌด์จ ์๋ฏธ์ธ์ง๋ฅผ ํ์ ์ ํ์ง ๋ชปํ๋ค. ๊ทธ๋์ ์ ํ๋ธ์์ ํด๋ก์ ๊ฐ์๋ฅผ ๋ณด๊ณ ์ด๋์ ๋ ์ดํด๊ฐ ๋๊ฒ ๊ฐ๋ค. ํด๋ก์ ๋ ํจ์๊ฐ ์์ฑ๋ ๋ ์ธ๋ถ ๋ณ์๋ฅผ ๊ธฐ์ตํ๊ณ , ์์ฑ ์ดํ์๋ ๊ณ์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ฒ์ด๋ค. ํด๋ก์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์บก์ํ์ ์ ๋ณด์๋์ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ ํจ๊ณผ๊ฐ ์๋ค. ๋์กํ๊ณ ์ด๋์ ๋ ์ดํด๊ฐ ๋ฌ์ง๋ง, ์์ง๋ ํท๊ฐ๋ฆฌ๊ณ ์ดํด๊ฐ ์ ๋งคํ๊ฒ ๋์ด์ ๋ค๋ฅธ ๋งค์ฒด๋ค์ ์ด์ฉํ์ฌ ํ์ต์ ๋ ํด์ผํ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ ๋จ์์ด์๋ค.
โ ๊ถ๊ธํ ๋ด์ฉ์ด๋ ์ ์ดํด๋์ง ์๋ ๋ด์ฉ
const funcs = Array.from(new Array(3), (_, i) => () => i);
์์_
์ ์๋ฏธ- ์ฌ์ฉํ์ง ์๋ ์ธ์๋ฅผ ํธ์ถํ ๋
_
์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ด๋ก
- ์ฌ์ฉํ์ง ์๋ ์ธ์๋ฅผ ํธ์ถํ ๋