๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

[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 ็š„็‹€ๆณไธ‹๏ผŒ้œ€่ฆ่‡ชๅทฑ่ฃœไธŠๅˆ†่™Ÿใ€‚