DroidScript
DroidScript
разработка мобильных приложений

Шаблон проектирования "Изолированный анонимный модуль JavaScript"

DroidScript  
13.05.2017

Изолированный анонимный модуль JavaScript - это модуль, внутри которого не создаётся ни одной глобальной переменной, а доступ к его функциональности осуществляется посредством возвращаемого им объекта. Использование такого модуля позволяет получить ряд интересных преимуществ при разработке приложений.

Для работы с модулем (доступа к функциональности внешнего JavaScript-файла) необходимо создать, по крайне мере, одну глобальную переменную. Данная переменная может ссылаться на глобальный объект модуля или глобальную функцию инициализации или конструктор. Это значит, что для обращения к модулю необходимо резервировать одну глобальную переменную. Если модулей 10, то резервируется уже 10 глобальных переменных. Вероятность их случайной перезаписи где-то в коде приложения или изменения названия самих модулей крайне мала, но она существует. Возникает вопрос, а можно ли создать анонимный модуль? Можно, но для этого необходимо загружать модуль, а не подключать его.

Загрузка модуля означает загрузку его кода из файла и выполнения его. Преимущество загрузки модуля состоит в возможности частичной интерпретации его кода, что будет показано далее.

Пример подключения и загрузки модуля.

// подключение
<script src="myScriptName.js"></script>

// загрузка
var code = app.ReadFile( 'myScriptName.js' );
function ВыполнитьКод ( code );

Для выполнения кода из строки используется функция eval (в глобальном или локальном контексте в обычном или строгом режиме) или Function. В DroidScript невозможно использовать eval в строгом режиме, поэтому воспользуемся динамическим созданием функции посредством Function для работы кода модуля в собственной области видимости.

Работу изолированного анонимного модуля сначала рассмотрим на примере его имитации.

var funcText = "\
  var myObject = {};\
  myObject.test = 'Тестовая строка';\
  return myObject;\
";

var myTestObject = Function( funcText )();
alert( myTestObject.test );
alert( myObject );

Сначала в переменной funcText присваивается текст модуля, который затем выполняется в строке Function( funcText )(). Пара пустых скобок необходима для вызова функции. Без них в переменную myTestObject будет возвращёно объявление функции (её код), а не результат её работы.

Строка alert( myObject ); вызовет исключение, так как myObject существует только внутри Function, что нам и нужно.

Аргумент, который передаётся в Function, интеретируется как функция, поэтому в конце текста модуля допустим вызов return myObject.

Теперь оформим модуль в отдельном файле и вызовем его.

module.js

var myObject = {};
myObject.test = 'Тестовая строка';
return myObject;

sample1.js

var module1 = Function( app.ReadFile( 'module.js' ))();
alert( module1.test );
alert( myObject );

Таким образом, переменная для доступа к модулю определяется на этапе его загрузки в приложение.

В заключении пример частичной загрузки кода модуля, что можно использовать, например, для загрузки его разных версий.

module.js

var myObject = {};
myObject.test = 'Тестовая строка';
return myObject;

//Начало
var myObject = {};
myObject.test = 'Новая текстовая строка';
return myObject;
//Конец

sample1.js

var code = app.ReadFile( 'module.js' ).split(/\/\/Начало|\/\/Конец/)[1];
var module1 = Function( code )();
alert( module1.test );
DroidScript  
© 2016-2022  Александр Страшко