all is well!!
5. ํด๋ก์ ๋ณธ๋ฌธ
๐ ํด๋ก์ ๋ ?
- ํด๋ก์ ๋ ๋ด๋ถ ํจ์๊ฐ ์ธ๋ถ ํจ์๋ณด๋ค ๋ ์ค๋ ์ ์ง ๋์์๋, ์ธ๋ถ ํจ์๊ฐ ์ข ๋ฃ๋ ํ์๋ ์ธ๋ถ ํจ์์ ๋ณ์๋ฅผ ๋ด๋ถ ํจ์์์ ์ฐธ์กฐํ ์ ์๋ ๊ตฌ์กฐ์ ๋๋ค.
- ํด๋ก์ ๊ฐ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ ์ด์ ๋ ์คํ ์ปจํ ์คํธ์ Lexical Environment์ ๊ด๋ จ์ด ์์ต๋๋ค. Lexical Environment๋ ๋ณ์๋ ํจ์ ์ ์ธ์ ์ ์ฅํ๋ Environment Record์, ์ธ๋ถ ํจ์์ Lexical Environment๋ฅผ ์ฐธ์กฐํ๋ Outer Environment Reference๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค. ๋๋ถ์ ์ธ๋ถ ํจ์๊ฐ ์ข ๋ฃ๋ ํ์๋ ๋ด๋ถ ํจ์๋ ์ธ๋ถ ํจ์์ ๋ณ์๋ฅผ ์ง์์ ์ผ๋ก ์ ๊ทผํ ์ ์์ต๋๋ค. ์ด๋ ์ฐธ์กฐ๋ ๋ณ์๋ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋์ด ์ ์ง๋ฉ๋๋ค.
- ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋์ด ์คํ์ ์์ด๊ณ , ํด๋ก์ ๋ ์ด ๊ณผ์ ์์ ํ์ฑํ ๋ฉ๋๋ค.
๐ต ์ฅ์
1. ์ํ๋ ์ ๋ณด(๋ณ์)๋ฅผ ์๋ํ ์ ์์ต๋๋ค.
function createCounter() {
let count = 0;
function increment() {
count++;
console.log(count);
}
function decrement() {
count--;
console.log(count);
}
return {
increment: increment,
decrement: decrement
};
}
console.log(count); // ์ ๊ทผ ๋ถ๊ฐ๋ฅ
๋ฉ์๋๋ค์ ์ธ๋ถ ํจ์์ ๋ณ์์ธ count ๋ณ์๋ฅผ ๊ณ์ ์ฐธ์กฐํ๊ณ ์์ต๋๋ค.
๊ทธ๋์ ํ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ทผ๊ณผ ์์ ์ด ๊ฐ๋ฅํ๊ณ ์ธ๋ถ์์ count ๋ณ์์ ์ง์ ์ ์ผ๋ก ์ ๊ทผํ ์ ์์ต๋๋ค.
count ๋ณ์๋ ์ค์ง increment()์ decrement()๋ฅผ ํตํด์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
2. ๋ชจ๋ํ๋ฅผ ํตํด ์๋์ด ํ์ํ ์ ๋ณด๋ค์ ํจ์ ์์ ์จ๊ธฐ๊ณ , ํ์ํ ๊ธฐ๋ฅ๋ง ํจ์ ์ธ๋ถ๋ก ๋ ธ์ถํ ์ ์์ต๋๋ค.
const counter = (function counterIIFE(){
let count = 0;
return {
getCounter: function () {
return count;
},
incrementCount: function () {
count++;
return count;
},
decrementCount: function () {
count--;
return count;
}
}
})();
counter.getCounter() // 0
counter.incrementCount() // 1
counter.incrementCount() // 2
counter.decrementCount() // 1
counter.getCounter() // 1
ํจ์๋ฅผ ์ ์ํ์๋ ๋์์ ํธ์ถ๋๋ IIFE(์ฆ์ ์คํ ํจ์ ํํ์)์ ์ด์ฉํด์ counter์์ counterIIFE๊ฐ ์คํํ๋ฉด์ ๊ฐ์ฒด๊ฐ ๋ฐํ๋ฉ๋๋ค. ๊ทธ ํ์๋ getCounter, incrementCount, decrementCount ๋ฉ์๋๋ฅผ ํตํด์๋ง count ๋ณ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
์์ ํจํด์ ํตํด ๋ชจ๋ํ์์ ํ์ํ ์์ ๋จ์์ ๋ ๋ฆฝ์ ์ธ ๊ธฐ๋ฅ, ์ฌ์ฌ์ฉ์ฑ, ์บก์ํ, ์ ์ง๋ณด์์ ์ฅ์ ๋ค์ ๊ฐ์ ธ๊ฐ ์ ์์ต๋๋ค.
3. ์ํ ์ ์ง๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
function createAdder(x) {
return function (y) {
return x + y;
};
}
const initAdd = createAdder(3);
initAdd(2) // 5
initAdd(8) // 11
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจํด ์ค ํ๋์ธ currying ํจํด๊ณผ ํด๋ก์ ๋ฅผ ํตํด์ ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์ธ์๊ฐ x์ ์ํ ์ ์ง๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์ธ์๋ ํจ์ ๋ด๋ถ์์ ๋ณ์๋ก ์ทจ๊ธ๋๊ธฐ ๋๋ฌธ์ ํด๋ก์ ๋ก ์ฐธ์กฐํ ์ ์์ต๋๋ค.
๐ด ๋จ์
1. ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ํ์ด ์์ต๋๋ค.
๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ธ๋ถ ํจ์ ์คํ์ด ๋๋ ํ์๋ ํด๋ก์ ๊ฐ ์ฐธ์กฐํ๋ ์ธ๋ถ ํจ์์ ๋ณ์๋ฅผ ํ ๋ฉ๋ชจ๋ฆฌ์์ ์ญ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋์ ํด๋ก์ ๋ฅผ ๋ฌด๋ถ๋ณํ๊ฒ ์ฌ์ฉํ๋ฉด ์ฐธ์กฐ๋ ์ธ๋ถ ๋ณ์๊ฐ ํ ๋ฉ๋ชจ๋ฆฌ์ ๊ณ์ ๋จ์์์ด, ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
2. ๋๋ฒ๊น ์ด ๊น๋ค๋ก์ธ ์ ์์ต๋๋ค.
์ธ๋ถ ํจ์์ ๋ณ์๋ฅผ ๊ณ์ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์, ๋๋ฒ๊น ํ ๋ ํด๋ก์ ๋ด๋ถ์์ ์ฐธ์กฐ๋๊ณ ์๋ ๋ณ์์ ์ํ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ด๋ ค์์ง ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ฝํ๊ฐ ๋ง์ด ๊ฒน์ณ์ง ํด๋ก์ ์ผ ๊ฒฝ์ฐ ๋ณ์์ ๊ฐ์ด ์ธ์ ๋ฐ๋์๋์ง ํ์ ํ๊ธฐ ๊น๋ค๋กญ์ต๋๋ค.
24๋ 10์ ์ ๋ฐ์ดํธ
'Javascript ๊ณต๋ถ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
7. JS์ 9๊ฐ์ง ํน์ง (0) | 2023.05.11 |
---|---|
6. ํ๋ก๊ทธ๋๋ฐ (0) | 2023.05.10 |
4. ์ค์ฝํ ์ฒด์ด๋ (0) | 2023.05.05 |
3. ์ฆ๊ฐ ์ฐ์ฐ์ (0) | 2023.02.20 |
2. ๋ ผ๋ฆฌ ์ฐ์ฐ์ (0) | 2023.01.24 |