๐ก ํด๋ก์ ๋ ์ค์ฝํ์ ์คํ ์ปจํ ์คํธ์ ๋ํ ์ฌ์ ์ง์์ด ์์ผ๋ฉด ์ดํดํ๋๋ฐ ๋์์ด ๋๋ค.
๐ก ํด๋ก์ ๋ ํจ์์ ๊ทธ ํจ์๊ฐ ์ ์ธ๋ ๋ ์์ปฌ ํ๊ฒฝ๊ณผ์ ์กฐํฉ์ด๋ค.
๐ก ํด๋ก์ ๋ ์ธ๋ถํจ์๋ณด๋ค ์ค์ฒฉํจ์๊ฐ ๋ ์ค๋ ์ ์ง๋๊ณ ์ด๋ฏธ ์๋ช ์ฃผ๊ธฐ๊ฐ ์ข ๋ฃํ ์ธ๋ถ ํจ์์ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
- ์์ ์ค์ฝํ์ ์ด๋ค ์๋ณ์๋ ์ฐธ์กฐํ์ง ์๋ ํจ์๋ ํด๋ก์ ๊ฐ ์๋๋ค.
- ์ค์ฒฉ ํจ์๊ฐ ํด๋ก์ ์์ง๋ง ์ธ๋ถ ํจ์๋ณด๋ค ์ผ์ฐ ์๋ฉธ๋๋ฉด ํด๋ก์ ์ ๋ณธ์ง์ ๋ถํฉํ์ง ์๋๋ค.
ํด๋ก์
- ํจ์ ์ผ๊ธ ๊ฐ์ฒด๋ก ์ทจ๊ธํ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฌ์ฉ๋๋ ์ค์ํ ํน์ฑ์ด๋ค.
- MDN์์์ ์ ์ : ํด๋ก์ ๋ ํจ์์ ๊ทธ ํจ์๊ฐ ์ ์ธ๋ ๋ ์์ปฌ ํ๊ฒฝ๊ณผ์ ์กฐํฉ์ด๋ค.
๋ ์์ปฌ ์ค์ฝํ(= ์ ์ ์ค์ฝํ)
const x = 1;
function foo() {
const x = 10;
// ์์ ์ค์ฝํ๋ ํจ์ ์ ์ ํ๊ฒฝ(์์น)์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค.
// ํจ์ ํธ์ถ ์์น์ ์์ ์ค์ฝํ๋ ์๋ฌด๋ฐ ๊ด๊ณ๊ฐ ์๋ค.
bar();
}
// ํจ์ bar๋ ์์ ์ ์์ ์ค์ฝํ
// ์ฆ ์ ์ญ ๋ ์์ปฌ ํ๊ฒฝ์ [[Environment]]์ ์ ์ฅํ์ฌ ๊ธฐ์ตํ๋ค.
function bar() {
console.log(x); // 1
}
// foo์ bar์ ๋ชจ๋ ์ ์ญ ํจ์๋ค.
foo(); // 1
bar(); // 1
์๋ฐ ์คํฌ๋ฆฝํธ ์์ง ํจ์๋ฅผ ์ด๋์ ํธ์ถํ๋์ง๊ฐ ์๋๋ผ ํจ์๋ฅผ ์ด๋์ ์ ์ํ๋์ง์ ๋ฐ๋ผ ์์ ์ค์ฝํ๋ฅผ ๊ฒฐ์ ํ๋ค.
ํด๋ก์ ์ ๋ ์์ปฌ ํ๊ฒฝ
const x = 1;
function outer() {
const x = 10;
const inner = function() { console.log(x); };
return inner;
}
// outer ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ค์ฒฉ ํจ์ inner๋ฅผ ๋ฐํํ๋ค.
const innerFunc = outer();
innerFunc(); // 10
์ธ๋ถ ํจ์๋ณด๋ค ์ค์ฒฉ ํจ์๊ฐ ๋ ์ค๋ ์ ์ง๋๋ ๊ฒฝ์ฐ
์ค์ฒฉ ํจ์๋ ์ด๋ฏธ ์๋ช ์ฃผ๊ธฐ๊ฐ ์ข ๋ฃํ ์ธ๋ถ ํจ์์ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
์ด๋ฌํ ์ค์ฒฉ ํจ์๋ฅผ ํด๋ก์ ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ํจ์๋ ์์ ์ ์์ ์ค์ฝํ๋ฅผ ๊ธฐ์ตํ๋ค.
์์ ์ค์ฝํ๋ ํจ์๋ฅผ ์ด๋์ ํธ์ถํ๋ ์๊ด์์ด ์ ์ง๋๋ฉฐ ์์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๊ณ ์๋ณ์์ ๋ฐ์ธ๋ฉ๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
const x = 1;
function outerFunc() {
const x = 10;
innerFunc();
}
function innerFunc() {
console.log(x); // 1
}
outerFunc(); // 1
์์ ์ค์ฝํ์ ์ด๋ค ์๋ณ์๋ ์ฐธ์กฐํ์ง ์๋ ํจ์๋ ํด๋ก์ ๊ฐ ์๋๋ค.
<!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>
์ค์ฒฉ ํจ์๊ฐ ํด๋ก์ ์์ง๋ง ์ธ๋ถ ํจ์๋ณด๋ค ์ผ์ฐ ์๋ฉธ๋๋ฉด ํด๋ก์ ์ ๋ณธ์ง์ ๋ถํฉํ์ง ์๋๋ค.
<!DOCTYPE html>
<html>
<body>
<script>
function foo() {
const x = 1;
// bar ํจ์๋ ํด๋ก์ ์์ง๋ง ๊ณง๋ฐ๋ก ์๋ฉธํ๋ค.
// ์ด๋ฌํ ํจ์๋ ์ผ๋ฐ์ ์ผ๋ก ํด๋ก์ ๋ผ๊ณ ํ์ง ์๋๋ค.
function bar() {
debugger;
// ์์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ๋ค.
console.log(x);
}
bar();
}
foo();
</script>
</body>
</html>
์ธ๋ถ ํจ์๋ณด๋ค ๋ ์ค๋ ์ ์ง๋๊ณ ์์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ๋ฉด ํด๋ก์ ์ด๋ค.
์์ ์ค์ฝํ์ ์๋ณ์ ์ค์์ ๊ธฐ์ตํด์ผ ํ ์๋ณ์๋ง ๊ธฐ์ตํ๋ค.
<!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>
ํด๋ก์ ์ ํ์ฉ
- ํด๋ก์ ๋ ์ํ๋ฅผ ์์ ํ๊ฒ ๋ณ๊ฒฝํ๊ณ ์ ์งํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
- ์ํ๋ฅผ ์์ ํ๊ฒ ์๋ํ๊ณ ํน์ ํจ์์๊ฒ๋ง ๋ณ๊ฒฝ์ ํ์ฉํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
์ฆ์ ์คํ ํจ์ ๋ด์์ ์ ์ธ๋ ๋ณ์๋ ์๋๋ ๋ณ์๋ค.
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
์ฆ์ ์คํ ํจ์ ๋ด์์ ์ ์ธ๋ ๋ณ์๋ ์ธ์คํด์ค๋ฅผ ํตํด ์ ๊ทผํ ์ ์์ผ๋ฉฐ, ์ฆ์ ์คํ ํจ์ ์ธ๋ถ์์๋ ์ ๊ทผํ ์ ์๋ ์๋๋ ๋ณ์๋ค.
๋ ๋ฆฝ๋ ๋ ์์ปฌ ํ๊ฒฝ์ ๊ฐ๊ฒ ๋๋ฉด ์์ ๋ณ์ ๊ฐ์ด ๊ณต์ ๋์ง ์๋๋ค.
// ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ๊ณ ํจ์๋ฅผ ๋ฐํํ๋ ๊ณ ์ฐจ ํจ์
// ์ด ํจ์๋ ์นด์ดํธ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํ ์์ ๋ณ์ 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 decrease = makeCounter(decrease);
console.log(decrease()); // -1
console.log(decrease()); // -2
- makeCounter ํจ์๋ ๋ณด์กฐ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ๊ณ ํจ์๋ฅผ ๋ฐํํ๋ ๊ณ ์ฐจ ํจ์์ด๋ค.
- ์ด ๊ณ ์ฐจ ํจ์๊ฐ ๋ฐํํ๋ ํจ์๋ ์์ ์ด ์์ฑ๋์ ๋์ ๋ ์์ปฌ ํ๊ฒฝ์ธ makeCounter ํจ์์ ์ค์ฝํ์ ์ํ counter ๋ณ์๋ฅผ ๊ธฐ์ตํ๋ ํด๋ก์ ๋ค.
- ์ฃผ์) makeCounter ํจ์๋ฅผ ํธ์ถํด ํจ์๋ฅผ ๋ฐํํ ๋ ๋ฐํ๋ ํจ์๋ ์์ ๋ง์ ๋ ๋ฆฝ๋ ๋ ์์ปฌ ํ๊ฒฝ์ ๊ฐ๋๋ค๋ ๊ฒ
- increaser์ ํ ๋นํ๊ธฐ ์ํด makeCounter ํจ์๋ฅผ ํธ์ถํ ์ดํ makeCounter ํจ์์ ์คํ ์ปจํ ์คํธ๋ ์๋ฉธ๋์ง๋ง,
- decreaser์ ํ ๋นํ๊ธฐ ์ํด ๋ค์ makeCounter๋ฅผ ํธ์ถํจ์ผ๋ก์จ ์๋ก์ด makeCounter ํจ์์ ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๊ธฐ ๋๋ฌธ์ด๋ค.
- ํ์ง๋ง ๊ฐ ๋ ์์ปฌ ํ๊ฒฝ์ ์ฐธ์กฐ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ์๋ฉธ๋์ง ์๋๋ค.
๋ ์์ปฌ ํ๊ฒฝ์ ๊ณต์ ํ๋ ํด๋ก์ ๋ฅผ ๋ง๋ค์ด์ผ ์์ ๋ณ์ ๊ฐ์ด ์ฐ๋๋๋ค.
// ํจ์๋ฅผ ๋ฐํํ๋ ๊ณ ์ฐจ ํจ์
// ์ด ํจ์๋ ์นด์ดํธ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํ ์์ ๋ณ์ 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
์บก์ํ์ ์ ๋ณด ์๋
์บก์ํ๋ ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ํ๋ด๋ ํ๋กํผํฐ์ ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ ์ ์๋ ๋์์ธ ๋ฉ์๋๋ฅผ ํ๋๋ก ๋ฌถ๋ ๊ฒ์ ๋งํ๋ค.
- ์ ๋ณด ์๋ : ์บก์ํ๋ ๊ฐ์ฒด์ ํน์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ถ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ
- ์ ๋ณด ๋ณดํธ : ์ ์ ์น ๋ชปํ ์ ๊ทผ์ผ๋ก๋ถํฐ ๊ฐ์ฒด์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋ฐฉ์ง
- ๊ฐ์ฒด ๊ฐ์ ์์กด์ฑ, ์ฆ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ ํจ๊ณผ๊ฐ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ ๋ณด ์๋์ ์์ ํ๊ฒ ์ง์ํ์ง ์๋๋ค.
const Person = (function () {
let _age = 0;
// ์์ฑ์ ํจ์
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
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ ๊ทผ ์ ํ์๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.
- ๋ชจ๋ public ํ๋ฉฐ ๋ชจ๋ ํ๋กํผํฐ์ ๋ฉ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ถ์ ๊ณต๊ฐ๋์ด ์๋ค.
- name ํ๋กํผํฐ๋ ํ์ฌ ์ธ๋ถ๋ก ๊ณต๊ฐ๋์ด ์์ด ์์ ๋กญ๊ฒ ์ฐธ์กฐ ๋ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค.
- _age ๋ณ์๋ ์ฆ์ ์คํ ํจ์์ ์ง์ญ ๋ณ์๋ก ์ค์ ํ์ฌ private ํ๋๋ก ์ค์ ํด ์ธ๋ถ์์ ์ฐธ์กฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๋ค.
- ์ฆ์ ์คํ ํจ์๊ฐ ๋ฐํํ๋ Person ์์ฑ์ ํจ์์ Person ์์ฑ์ ํจ์์ ์ธ์คํด์ค๊ฐ ์์๋ฐ์ ํธ์ถํ 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.prototype.sayHi ๋ฉ์๋๊ฐ ๋จ ํ ๋ฒ ์์ฑ๋๋ ํด๋ก์ ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ํ์์ด๋ค.
์ฆ์ ์คํ ํจ์๊ฐ ํธ์ถ๋ ๋ ์์ฑ๋๋ค. ์ด๋ Person.prototype.sayHi ๋ฉ์๋๋ ์์ ์ ์์ ์ค์ฝํ์ธ ์ฆ์ ์คํ ํจ์์ ์คํ ์ปจํ ์คํธ์ ๋ ์์ปฌ ํ๊ฒฝ์ ์ฐธ์กฐ๋ฅผ [[Environment]]์ ์ ์ฅํ์ฌ ๊ธฐ์ตํ๋ค.
๋ฐ๋ผ์ Person ์์ฑ์ ํจ์์ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ์์์ ํตํด ํธ์ถํ ์ ์๋ Person.prototype.sayHi ๋ฉ์๋์ ์์ ์ค์ฝํ๋ ์ด๋ค ์ธ์คํด์ค๋ก ํธ์ถํ๋๋ผ๋ ํ๋์ ๋์ผํ ์์ ์ค์ฝํ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ์ฌ๋ฌ ์ธ์คํด์ค ์์ฑ ์ _age ๋ณ์ ์ํ๊ฐ ์ ์ง๋์ง ์๋๋ค.
์์ฃผ ๋ฐ์ํ๋ ์ค์
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๋ฅผ ๋ฐํ๋์ด์ผ ํ์ง๋ง 3, 3, 3์ด ๋ฐํ๋๋ค.
- ๊ทธ ์ด์ ๋ var ํค์๋๋ก ์ ์ธํ i ๋ณ์๋ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๊ฐ ์๋ ํจ์ ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์ ์ ์ญ ๋ณ์์ด๋ค.
- ๋ฐ๋ผ์ funcs[j]๋ฅผ ํธ์ถํ ๋ ์ ์ญ ๋ณ์ i๋ฅผ ์ฐธ์กฐํ์ฌ 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]());
// 0
// 1
// 2
}
- ์ฆ์ ์คํ ํจ์๋ ์ ์ญ ๋ณ์ i์ ํ์ฌ ํ ๋น๋์ด ์๋ ๊ฐ์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๋งค๊ฐ๋ณ์ id์ ํ ๋นํ ํ ์ค์ฒฉ ํจ์๋ฅผ ๋ฐํํ๊ณ ์ข ๋ฃ๋๋ค.
- ๋ฐ๋ผ์, ๋ฐํ๋ ์ค์ฒฉํจ์๋ ์์ ์ค์ฝํ๋ฅผ ๊ธฐ์ตํ๋ ํด๋ก์ ์ด๊ธฐ์ ๋งค๊ฐ๋ณ์ id๋ ์์ ๋ณ์๋ก์ ํด๋น ์ค์ฒฉ ํจ์์ ๋ฌถ์ฌ์๊ฒ ๋๋ค.
๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ๊ฐ๋ let์ ์ฌ์ฉํ๋ฉด ์๋์ ๊ฐ์ด ๋ ๊น๋ํ๊ฒ ํด๊ฒฐ
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 ๋ฌธ์ ์ฝ๋ ๋ธ๋ก ๋ด์์ ์ ์ํ ํจ์๊ฐ ์๋ค๋ฉด ์ด ํจ์์ ์์ ์ค์ฝํ๋ for ๋ฌธ์ ์ฝ๋ ๋ธ๋ก์ ์๋ก์ด ๋ ์์ปฌ ํ๊ฒฝ์ด๋ค.
- ์ด๋ ํจ์์ ์์ ์ค์ฝํ๋ for ๋ฌธ์ ์ฝ๋ ๋ธ๋ก์ด ๋ฐ๋ณต ์คํ๋ ๋๋ง๋ค ์๋ณ์(for ๋ฌธ์ ๋ณ์ ์ ์ธ๋ฌธ์์ ์ ์ธํ ์ด๊ธฐํ ๋ณ์ ๋ฐ for ๋ฌธ์ ์ฝ๋ ๋ธ๋ก ๋ด์์ ์ ์ธํ ์ง์ญ ๋ณ์ ๋ฑ)์ ๊ฐ์ ์ ์งํด์ผ ํ๋ค.
- ์ด๋ฅผ ์ํด for ๋ฌธ์ด ๋ฐ๋ณต๋ ๋๋ง๋ค ๋ ๋ฆฝ์ ์ธ ๋ ์์ปฌ ํ๊ฒฝ์ ์์ฑํ์ฌ ์๋ณ์์ ๊ฐ์ ์ ์งํ๋ค.
- ์ด์ฒ๋ผ let์ด๋ const ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐ๋ณต๋ฌธ์ ์ฝ๋ ๋ธ๋ก์ ๋ฐ๋ณต ์คํํ ๋๋ง๋ค ์๋ก์ด ๋ ์์ปฌ ํ๊ฒฝ์ ์์ฑํ์ฌ ๋ฐ๋ณตํ ๋น์์ ์ํ๋ฅผ ๋ง์น ์ค๋ ์์ ์ฐ๋ ๊ฒ์ฒ๋ผ ์ ์ฅ
- ๋จ, ์ด๋ ๋ฐ๋ณต๋ฌธ์ ์ฝ๋ ๋ธ๋ก ๋ด๋ถ์์ ํจ์๋ฅผ ์ ์ํ ๋ ์๋ฏธ๊ฐ ์๋ค.
- ๋ฐ๋ณต๋ฌธ์ ์ฝ๋ ๋ธ๋ก ๋ด๋ถ์ ํจ์ ์ ์๊ฐ ์๋ ๋ฐ๋ณต๋ฌธ์ด ์์ฑํ๋ ์๋ก์ด ๋ ์์ปฌ ํ๊ฒฝ์ ๋ฐ๋ณต ์งํ, ์๋ฌด๋ ์ฐธ์กฐํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋์์ด ๋๋ค.
๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ธ ๊ณ ์ฐจ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
// ์์๊ฐ 3๊ฐ์ธ ๋ฐฐ์ด์ ์์ฑํ๊ณ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ์์๋ก ์ถ๊ฐ
// ๋ฐฐ์ด์ ์์๋ก ์ถ๊ฐ๋ ํจ์๋ค์ ๋ชจ๋ ํด๋ก์ ๋ค.
const funcs = Array.from(new Array(3), (_, i) => () => i);
// ๋ฐฐ์ด์ ์์๋ก ์ถ๊ฐ๋ ํจ์๋ค์ ์์ฐจ์ ์ผ๋ก ํธ์ถ
funcs.forEach(f => console.log(f())); // 0 1 2
์ด ๋ฐฉ๋ฒ์ ๋ณ์์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉ์ ์ต์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๋ฅผ ์ค์ด๊ณ ๊ฐ๋ ์ฑ์ ์ข๊ฒ ๋ง๋ญ๋๋ค.
'Frontend > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ ์์ปฌ ์ค์ฝํ (0) | 2024.05.08 |
---|---|
์ค์ฝํ ์ฒด์ธ (0) | 2024.05.08 |
์คํ ์ปจํ ์คํธ (0) | 2024.03.23 |
์์ ๊ฐ๊ณผ ๊ฐ์ฒด์ ๋น๊ต (0) | 2024.03.14 |
์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด, ์ดํฐ๋ฌ๋ธ, ๋ํผ ๊ฐ์ฒด (0) | 2024.03.13 |