2014-02-06 5 views
1

Рассмотрим:Объявление Namespaces

var MyApp = MyApp || {}; 
MyApp.doAlert = function(message) { alert(message); }; 
MyApp.doAlert("from MyApp"); 

и

(function(ns) { 
    ns.doAlert = function(message) { 
    alert(message); 
}; 
})(window.MyApp2 = window.MyApp2 || {}); 
MyApp2.doAlert("from MyApp2"); 

Они оба работают, и, насколько я могу судить, по сути то же самое. Цель состоит в том, чтобы объявить пространство имен.

Есть ли преимущество одного стиля над другим?

+0

В вашем простом примере: Нет. Читайте на [закрытиях] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures), они очень полезны/необходимы время от времени. Также [IIFE] (http://en.wikipedia.org/wiki/Immediately-invoked_function_expression) – Xotic750

ответ

3

Последний оборачивает метод (ы) в анонимной функции, скорее всего, по двум причинам:

  1. Шортер (сокращенно) ссылка на то же самое (MyApp против ns).
  2. Он завернут в анонимную функцию, чтобы сохранить любые дальнейшие объявления из глобальной области.

Обычно вы чаще всего видите последнее, чтобы избежать множества модулей, определяющих общие имена переменных (и переопределяющее значение).

Смотрите также What is the purpose of wrapping whole Javascript files in anonymous functions like “(function(){ … })()”?

+0

Хорошие точки Брэд, не могли бы вы утверждать, что объявление в функции, вероятно, не нужно, если модуль находится в пространстве имен? – pedalpete

+1

@pedalpete: Я стараюсь делать это независимо. Тем не менее, вы можете запускать, чтобы не выполнять функции внутри объекта «MyApp», а вспомогательные функции, которые вы не хотите загромождать глобальное пространство имен. –

+0

На второй пункт вашего ответа, разве они не оставляют дальнейшие декларации из глобальной сферы? Я не вижу разницы в отношении обзора. –

0

Первая стандартная декларация вашего MyApp пространства имен.

Во-вторых, вы объявляете свое пространство имен MyApp2 и в том же процессе, вы передаете его в самообъявляющуюся анонимную функцию.

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