do es6 modules make the case of iifes obsolete - Lee-hyuna/33-js-concepts-kr GitHub Wiki
ES6 ๋ชจ๋์ด IIFE๋ฅผ ๊ตฌ์๋์ ์ ๋ฌผ๋ก ๋ง๋๋๊ฐ?
IIFE (Immediately Invoked Function Expression) ๋ ์ต๋ช ์ ํด๋ก์ ๋ฅผ ํตํด "privacy"๋ฅผ ์ ๊ณตํ๋ ์ค๊ณ ํจํด์ผ๋ก ์ฌ์ฉ๋๋ค. ES6 ๋ชจ๋์ ์ถํ์ IIFE์ ์ฌ์ฉ์ ๊ตฌ์๋์ ์ ๋ฌผ๋ก ๋ง๋๋๊ฐ?
์๋๋ฉด ์์ง๋ IIFE๋ฅผ ์ํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์๊น?
IIFE๋ ํจ์๊ฐ ์ฝ๋์ ๋ธ๋ก ์ค์ฝํ๋ฅผ ๋ง๋๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด์๊ธฐ ๋๋ฌธ์, ES5 ํ์ค์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ํจํด ์ค ํ๋์๋ค. ๋ฐ๋ผ์ ๋ค์ ์ฝ๋๋ ReferenceError
๋ฅผ ๋ฐ์์ํฌ ๊ฒ์ด๋ค.
(function() {
var scoped = 42;
}());
console.log(scoped); // ReferenceError
ECMAScript๋ IIFE ๋์ ์ ์ฌ์ฉํ ๋ธ๋ก ์ค์ฝํ๊ฐ ์ ์ฉ๋๋ let
๊ณผ const
๋ฅผ ๋์
ํ๋ค. ์๋์ ์ฝ๋๋ฅผ ๋ณด์.
{
let scoped = 42;
}
console.log(scoped); // ReferenceError
์ด ์ฝ๋๊ฐ ์ด์ ์ฝ๋๋ณด๋ค ๋ ๋ช ํํ๊ณ ์ดํดํ๊ธฐ ์ฝ๋ค.
IIFE๋ ๋ ธ์ถ ๋ชจ๋ ํจํด์์ ๋น๋ฉ ๋ธ๋ก์ผ๋ก ์ฌ์ฉ๋์๋ค. ์ด๋ public๊ณผ private๋ฅผ ๋ช ํ์ด ๊ตฌ๋ถํ๋ ๊ฒ์ด ์ฅ์ ์ด๋ค.
var myModule = (function() {
// private ๋ณ์, IIFE ์์์๋ง ์ ๊ทผํ ์ ์๋ค.
var counter = 0;
function increment() {
counter++;
}
// ์ธ๋ถ๋ก ๋
ธ์ถ๋๋ ๋ก์ง
return {
increment: increment
}
}());
์ด ํจํด์ ์ฌ์ฉํ๋ ๊ฒ ๋์ ์, ES6์ ๋ชจ๋์ ์ฌ์ฉํ ์ ์๋ค. ๋ชจ๋์ ์์ ์ ์ค์ฝํ๋ฅผ ์ ์ธํ๊ณ ๋ชจ๋ ๋ด๋ถ์์ ์์ฑ ๋ ๋ณ์๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ค์ผ์ํค์ง ์๋๋ค.
// myModule.js
let counter = 0;
export function increment() {
counter++;
}
// logic.js
import {increment} from 'myModule.js';
increment();
IIFE๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์ฆ์ ํธ์ถ๋๋ ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ ๋์ด๋ค. ๋๋ก๋ ๋จ์ผ ํํ์์ด ์๋๋ผ ์ผ๋ จ์ ๊ตฌ๋ฌธ์ ํตํด์๋ง ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ์ด๋ฌํ ๊ตฌ๋ฌธ์ ์ธ๋ผ์ธํ ํ๋ ค๋ฉด ์ฆ์ ํจ์๋ฅผ ํธ์ถํด์ผ ํ๋ค;
const SENTENCE = 'Hello world, how are you?';
const REVERSE = (() => {
const array = [...SENTENCE];
array.reverse();
return arr.join('');
})();
ํ์ดํ ํจ์๋ฅผ ๊ดํธ( )
๋ก ๋ฌถ์ด์ผ ํจ์ ๋ช
์ฌํด๋ผ, (์ ์ฒด ํจ์๋ฅผ ๊ฐ์ธ์ง ์์).
๋๋์
- ์งง์์ ์ข๋ค.
- ๊ธ๋ก๋ฒ ๋ณ์์ ์ค์ผ(polution)์ด๋ผ๋ ํํ์ ์์ฃผ ์ฐ๋๊ตฌ๋.