모듈
모듈은 관련 변수나 함수로 구성되어있으며 공개 및 비공개 데이터로 구분되어있다.
모듈은 stateful하며 상태를 관리할 수 있다.
상태를 저장하는 변수 없이 함수만 있다면 이건 모듈이 아니라 네임스페이스이다.
데이터와 상태 저장 함수가 포함된 구조를 가진 함수여도 데이터에 대한 캡슐화가 없으면 모듈이라고 보기 어렵다
모듈이라고 함은 변수와 함수로 구성되어있되, 변수에 접근성을 부여할 수 있어야한다. (공개, 비공개)
IIFE를 사용한다는것은 싱글톤으로 사용하겠다는 의미이다.
There must be an outer scope, typically from a module factory function running at least once.
The module's inner scope must have at least one piece of hidden information that represents state for the module.
The module must return on its public API a reference to at least one function that has closure over the hidden module state (so that this state is actually preserved).
모듈 팩토리 함수가 외부 스코프에서 한번 이상 실행되어야함.
모듈의 내부 스코프가 하나 이상의 비공개 정보를 참조하고 있어야함.
모듈은 내부 데이터에 접근할 수 있는 public API를 제공해야 하며, 내부 데이터에 대한 클로저를 갖는 최소 하나 이상의 함수를 반환해야한다.