[Hard] ๐ IIFE
1. What's the IIFE ?โ
IIFE๋ ์ฆ์ ์คํ ํจ์ ํํ์์ด๋ผ๊ณ ๋ ํ๋ฉฐ, ์ผ๋ฐ ํจ์์ ์์ฑ๋ฒ์ด ๋ค๋ฆ
๋๋ค. ์ธ๋ถ์ ()๋ฅผ ํ ๊ฒน ๋ ๊ฐ์ธ์ผ ํ๋ฉฐ, ์ฆ์ ์คํ๋๋ ํน์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค:
(() => {
console.log(1);
})();
# or
(function () {
console.log(2);
})();
์ด ์ธ์๋ recursion(์ฌ๊ท)์ ์ฌ์ฉํ์ฌ ์ค๋จ ์กฐ๊ฑด์ ๋๋ฌํ ๋๊น์ง ๋ฐ๋ณต ์คํํ ์ ์์ผ๋ฉฐ, ๋๋ถ๋ถ์ ()๋ก ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
(function myIIFE() {
num += 1;
console.log(num);
return num < 5 ? myIIFE(num) : console.log('finished!!');
})((num = 0));
๋ค๋ง ์ฃผ์ํด์ผ ํ ์ ์, IIFE๋ ์ด๊ธฐ ์คํ ์์๋ง ์คํ๋๊ฑฐ๋ ๋ด๋ถ์์ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ ์ ์์ ๋ฟ, ์ธ๋ถ์์ ๋ค์ ํธ์ถํ์ฌ ์คํํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
2. Why use IIFE ?โ
scopeโ
๋ณ์๊ฐ function ๋ด์์ ์๋ฉธ๋๋ ํน์ฑ์ ์ด์ฉํ์ฌ, IIFE๋ก ์ค์ฝํ๋ฅผ ๊ฒฉ๋ฆฌํ๊ณ ์ ์ญ ๋ณ์์ ์ค์ผ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์๋ ์์๋ฅผ ์ฐธ๊ณ ํ์ธ์:
// global
const name = 'Yumi';
const Hello = () => {
return `Hello ${name}!`;
};
(() => {
const name = 'Pitt';
const Hello = () => {
return `Hello ${name}!`;
};
console.log(name); // result Pitt
console.log(Hello()); // result Hello Pitt!
})();
console.log(name); // result Yumi
console.log(Hello()); // result Hello Yumi!
private variable and methodsโ
IIFE์ closure๋ฅผ ๊ฒฐํฉํ๋ฉด Private variable and methods๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ฆ, function ๋ด์ ๋ณ์๋ฅผ ์ ์งํ ์ ์์ผ๋ฉฐ, ํด๋น function์ ํธ์ถํ ๋๋ง๋ค ์ด์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ ์กฐ์ (์ฆ๊ฐ ๋๋ ๊ฐ์ ๋ฑ)ํ ์ ์์ต๋๋ค.
const increment = (() => {
let result = 0;
console.log(result);
const credits = (num) => {
console.log(`I have ${num} credits.`);
};
return () => {
result += 1;
credits(result);
};
})();
increment(); // I have 1 credits.
increment(); // I have 2 credits.
๋ค๋ง ์ฃผ์ํด์ผ ํ ์ ์, ๋ณ์๊ฐ ์๋ฉธ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋จ์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ์ฌ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
moduleโ
๊ฐ์ฒด ํํ๋ก ์คํํ ์๋ ์์ต๋๋ค. ์๋ ์์๋ฅผ ๋ณด๋ฉด ๋ณ์ ์ฆ๊ฐ๋ฟ๋ง ์๋๋ผ ์ด๊ธฐํ๋ ๊ฐ๋ฅํจ์ ์ ์ ์์ต๋๋ค:
const Score = (() => {
let result = 0;
return {
current: () => {
return result;
},
increment: () => {
result += 1;
},
reset: () => {
result = 0;
},
};
})();
Score.increment();
console.log(Score.current()); // result 1 => 0 + 1 = 1
Score.increment();
console.log(Score.current()); // result 2 => 1 + 1 = 2
Score.reset();
console.log(Score.current()); // result 0 => reset = 0
๋ค๋ฅธ ์์ฑ ๋ฐฉ๋ฒ:
const Score = (() => {
let result = 0;
const current = () => {
return result;
};
const increment = () => {
result += 1;
};
const reset = () => {
result = 0;
};
return {
current: current,
increment: increment,
reset: reset,
};
})();
Score.increment();
console.log(Score.current());
Score.increment();
console.log(Score.current());
Score.reset();
console.log(Score.current());
๋ง์ง๋ง์ผ๋ก ํนํ ์ฃผ์ํด์ผ ํ ์ ์, IIFE์ ์ฆ์ ์คํ ํน์ฑ ๋๋ฌธ์ ์ฐ์๋ ๋ ๊ฐ์ ์ฆ์ ์คํ ํจ์๊ฐ ์์ ๊ฒฝ์ฐ ASI(์๋ ์ธ๋ฏธ์ฝ๋ก ์ฝ์
) ๊ท์น์ด ์ ๋๋ก ์๋ํ์ง ์์ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ์ฐ์๋ ๋ ๊ฐ์ IIFE๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ง์ ์ธ๋ฏธ์ฝ๋ก ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.