Паттерн Модуль

Паттерн "Модуль" базируется на замыканиях и состоит из двух компонентов: внешняя функция, которая определяет лексическое окружение, и возвращаемый набор внутренних функций, которые имеют доступ к этому окружению.
Определим простейший модуль:

	let foo = (function(){
	let obj = {greeting: "hello"};
	
	return {
	display: function(){
	console.log(obj.greeting);
	}
	}
	})();
	foo.display();	// hello
	
	

Здесь определена переменная foo, которая представляет результат анонимной функции. Внутри подобной функции определен объект obj с некоторыми данными.
Сама анонимная функция возвращает объект, который определяет функцию display. Возвращаемый объект определяет общедоступый API, через который мы можем обращаться к данным, определенным внутри модуля. return { display: function(){ console.log(obj.greeting); } } Такая конструкция позволяет закрыть некоторый набор данных в рамках функции-модуля и опосредовать доступ к ним через определенный API - возвращаемые внутренние функции.
Рассмотрим чуть более сложный пример:

	let calculator = (function(){
	let data = { number: 0};
	
	return {
	sum: function(n){
	data.number += n;
	},
	subtract: function(n){
	data.number -= n;
	},
	display: function(){
	console.log("Result: ", data.number);
	}
	}
	})();
	calculator.sum(10);
	calculator.sum(3);
	calculator.display();	// Result: 13
	calculator.subtract(4);
	calculator.display();	// Result: 9
	

Данный модуль представляет примитивный калькулятор, который выполняет три операции: сложение, вычитание и вывод результата.
Все данные инкапсулированы в объекте data, который хранит результат операции. Все операции представлены тремя возвращаемыми функциями: sum, subtract и display. Через эти функции мы можем управлять результатом калькулятора извне.