Оглавление

19.3. Пространства имен

Предположим, программист написал функцию с названием inArray (). Через некоторое время потребовалось подключить модуль стороннего разработчика, в котором все функции объявлены в глобальной области видимости. Если в этом модуле объявлена функция с названием inArray (), то возникнет конфликт имен. Следует заметить, что никакого сообщения об ошибке в данном случае выведено не будет. Функция, которая объявлена последней, просто переопределит уже существующую функцию. Далее все зависит от частоты использования функции. Все выражения, которые зависят от этой функции, станут работать некорректно. В итоге будет получен результат, который не планировался, или программа завершится с критической ошибкой.
Чтобы избежать подобной ситуации следует строго придерживаться концепции пространств имен. Согласно этой концепции модуль может импортировать в глобальную область видимости только один идентификатор. Следует заметить, что это требование касается не только модулей сторонних разработчиков, но и относится к вашим собственным программам.
В языке JavaScript в качестве пространства имен используются объекты. Созданный экземпляр помещается в глобальную область видимости, а остальные идентификаторы доступны через свойства объекта:

   var myModule = {}; // Объявление пространства имен
   myModule.test = function() {
      window.alert("Это функция test");
   }
   myModule.inArray = function() {
      window.alert("Это функция inArray");
   }
   myModule.test();
   myModule.inArray();


В этом примере функция inArray () расположена внутри пространства myModule. Поэтому конфликт имен сводится к минимуму. Однако может возникнуть ситуация, когда пространства имен называются одинаково. В этом случае решением является создание вложенных объектов. Очень часто название пространства имен совпадает с названием сайта разработчика. В качестве основного объекта используется название зоны, а вложенный объект носит название домена. Например, для сайта http://wwwadmin.ru/ создание пространства имен будет выглядеть так:

var ru; // Объявляем, иначе будет ошибка при проверке
if (!ru) ru = {}; // Объявление пространства имен
else if (typeof ru != "object")
   throw new Error("Идентификатор ru не является объектом");
if (ru.wwwadmin)
   throw new Error("Пространство имен уже занято");
ru.wwwadmin = { // Объявление вложенного пространства имен
   test: function() {
      window.alert("Это функция test");
   },
   inArray: function() {
      window.alert("Это функция inArray");
   }
};
ru.wwwadmin.test();
ru.wwwadmin.inArray();


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

   var $ = ru.wwwadmin;
   $.test();
   $.inArray();

 

Кроме того, можно использовать анонимную функцию, в параметре которой указывается короткий идентификатор, а при вызове функции передается ссылка на объект, являющийся пространством имен:

   (function($) {
      $.test();
      $.inArray();
   })(ru.wwwadmin);


В этом примере идентификатор $ будет доступен только внутри анонимной функции, а так как функция не имеет названия, в глобальной области видимости никакой идентификатор не сохраняется.

 

Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити