3.3.2 즉시 실행 모듈 생성
API를 반환하는 건 임의 모듈과 같지만, 외부 함수를 선언하자마자 실행하는 방법이다. 반환된 API는 이름공간을 가진 전역 변수에 할당된 후 해당 모듈의 싱글톤 인스턴스가 된다. 예제 3-1을 이런 식으로 고치면 예제 3-2처럼 된다.
예제 3-2 싱글톤 모듈
var MyApp = MyApp | | {}; MyApp.WildlifePreserveSimulator = (function() { var animals = []; return { addAnimal: function(animalMaker,species, sex) { animals.push(animalMaker.make(species,sex)); }, getAnimalCount: function() { return animals.length; } }; }()); // <–즉시 실행한다!
싱글톤은 이렇게 사용한다.
MyApp.WildlifePreserveSimulator.addAnimal(realAnimalMaker, gorilla, female);
외부 함수는 애플리케이션 기동 코드의 실행과 상관없이 코드가 작성된 지점에서 즉시 실행된다. 따라서 함수 (즉시) 실행 시 의존성을 가져오지 못하면 외부 함수에 주입할 수 없다. 이런 점은 다소 불편하다. 싱글톤이 꼭 필요하다면 임의 모듈 패턴으로 모듈을 코딩하고 해당 모듈을 요청할 때마다 의존성 주입 프레임워크에서 같은 인스턴스를 제공하는 편이 의존성 주입 측면에서 더 낫다. 앵귤러JS가 ‘서비스’ 싱글톤을 내어주는 방식도 이와 같다.