Изолированный анонимный модуль 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 );