Экспорт переменных и функций в модулях через замыкания в JavaScript

Иногда нужно сделать так, чтобы некоторые переменные и функции модуля были доступны снаружи. Давайте посмотрим, как это делается. Пусть у нас есть следующий модуль:

;(function() { let str = 'переменная модуля'; function func() { alert('функция модуля'); } })();

Давайте экпортируем нашу функцию func. Для этого запишем ее в свойство встроенного в браузер объекта window:

;(function() { let str = 'переменная модуля'; function func() { alert('функция модуля'); } window.func = func; })();

Теперь мы можем вызвать нашу функцию снаружи модуля:

;(function() { let str = 'переменная модуля'; function func() { alert('функция модуля'); } window.func = func; })(); window.func(); // выведет 'функция модуля'

При этом не обязательно вызывать функцию как свойство объекта window:

;(function() { let str = 'переменная модуля'; function func() { alert('функция модуля'); } window.func = func; })(); func(); // выведет 'функция модуля'

Дан следующий модуль:

;(function() { let str1 = 'переменная модуля'; let str2 = 'переменная модуля'; let str3 = 'переменная модуля'; function func1() { alert('функция модуля'); } function func2() { alert('функция модуля'); } function func3() { alert('функция модуля'); } })();

Эскортируйте наружу одну из переменных и две любые функции.

Экспорт объекта

Пусть у нас есть следующий модуль:

;(function() { function func1() { alert('функция модуля'); } function func2() { alert('функция модуля'); } function func3() { alert('функция модуля'); } })();

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

;(function() { function func1() { alert('функция модуля'); } function func2() { alert('функция модуля'); } function func3() { alert('функция модуля'); } window.module = {func1: func1, func2: func2, func3: func3}; })();

Так как имена ключей и переменных совпадают, то объект с функциями можно упросить:

;(function() { function func1() { alert('функция модуля'); } function func2() { alert('функция модуля'); } function func3() { alert('функция модуля'); } window.module = {func1, func2, func3}; })();

Можно пойти и другим путем. Будем записывать функции в объект сразу при описании функции, вот так:

;(function() { let module = {}; module.func1 = function() { alert('функция модуля'); } module.func2 = function() { alert('функция модуля'); } module.func3 = function() { alert('функция модуля'); } window.module = module; })();

Дан следующий модуль:

;(function() { let str1 = 'переменная модуля'; let str2 = 'переменная модуля'; let str3 = 'переменная модуля'; function func1() { alert('функция модуля'); } function func2() { alert('функция модуля'); } function func3() { alert('функция модуля'); } function func4() { alert('функция модуля'); } function func5() { alert('функция модуля'); } })();

Эскортируйте наружу объект с первыми пятью функциями и первыми двумя переменными.