IIFE는 "Immediately Invoked Function Expression"의 약어로, 즉시 호출되는 함수 표현식을 나타낸다. 이것은 javascript에서 함수를 정의하고 즉시 실행하는 패턴 중 하나이다. IIFE를 사용하면 함수를 정의하자마자 바로 실행하여 지역 범위를 생성하고, 전역 범위의 오염을 피할 수 있다. 이러한 IIFE는, 함수를 즉시 실행시켜야 하는 상황 or 함수의 재사용이 필요하지 않는 상황 or 함수의 네이밍을 짓기 힘든 상황 등에 사용하면 좋다.
아래에서 IIFE의 주요 특징과 사용법에 대해 자세히 살펴보자.
// function 함수
(function() {
// 코드 작성
})();
// arrow 함수
(() => {
// 코드 작성
})();
(function() {
var localVar = "IIFE Example";
console.log(localVar); // 접근 가능
})();
console.log(localVar); // 에러: localVar는 정의되지 않음
// 전역 스코프
(function() {
var localVar = "IIFE Example";
console.log(localVar); // 접근 가능
})();
console.log(localVar); // 에러: localVar는 정의되지 않음
// function 함수
(function(name: string) {
console.log('Hello, ' , name);
})("John"); // Hello, John
// arrow 함수
((name: string) => {
console.log('Hello, ', name);
})()
const myModule = (function() {
const privateVar = 'I am private';
function privateFunction() {
console.log('This is a private function');
}
return {
publicVar: 'I am public',
publicFunction: function() {
console.log('This is a public function');
}
};
})();
console.log(myModule.publicVar); // 접근 가능
myModule.publicFunction(); // This is a public function
console.log(myModule.privateVar); // undefined (접근 불가)
myModule.privateFunction(); // TypeError: myModule.privateFunction is not a function
재사용 불가능
함수는 동일한 기능을 여러 곳에서 사용하기 위해 만들어진다. 하지만 IIFE로 만들어진 함수는 실행되자마자 바로 사라지기 때문에 재사용할 수 없으며 이는 함수의 의의성에 대해서 의문이 들기도 한다.
가독성 감소
IIFE는 코드의 가독성을 감소시킬 수 있다. 코드가 길어지고 여러 IIFE가 중첩될 경우, 코드의 흐름을 이해하기 어려워질 수 있다.
디버깅 어려움
IIFE 내부에서 선언된 변수들은 외부에서 접근할 수 없어 디버깅이 어려울 수 있다. 디버깅 시에는 IIFE를 사용하기보다는 모듈 시스템 등을 고려하는 것이 유리할 수도 있다.
의존성 관리
import
및 export
를 사용하지 않으므로, IIFE를 사용하면 모듈 간의 의존성을 명확히 정의하기 어려울 수 있다.
메모리 관리
IIFE는 실행 후 즉시 해제되지만, 그 안에서 생성된 객체나 함수는 외부에서 참조되지 않아도 계속 메모리에 남을 수 있다. 이는 메모리 누수의 원인이 될 수 있다.