본문으둜 κ±΄λ„ˆλ›°κΈ°

[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κ°€ μžˆλŠ” κ²½μš°μ—λŠ” 직접 μ„Έλ―Έμ½œλ‘ μ„ μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.