tl; dr: выберите один метод и будьте последовательны .
На мой взгляд, первый метод имеет небольшое преимущество для удобочитаемости. В моей голове, когда я читаю его, я вижу, что «модуль app
определяется» и что все внутри этого замыкания принадлежит этому модулю. Это естественное разложение для меня и навязывает объектно-ориентированную природу модуля, который должен быть определен.
Еще одна причина, по которой я предпочитаю первый метод, заключается в том, что более разумно изменить область, в которой определен модуль. Каждый модуль, который вы определяете, не должен быть частью глобальной области видимости. Используя второй метод, если область не вводится путем передачи родительского объекта, как иллюстрирует Джаред Фарриш на своем примере jQuery, тогда вы рискуете сломать свой код, если решите изменить имя этот родительский объект. Этот пример иллюстрирует точку:
var namespace = {
subns: { ... }
};
(function() {
var module = { ... };
namespace.subns.someModule = module;
}());
Каждый раз, когда идентификаторы namespace
или subns
меняются, вам также необходимо обновить этот модуль и любой другой модуль, который следует этому шаблону, и добавляет себя к тому же объекту.
В общем, ни один метод, ни второй метод (с внедрением зависимости) не "лучше", чем другой, это просто вопрос предпочтений. Единственное преимущество, которое может принести это обсуждение, заключается в том, что вы должны выбрать один метод и быть последовательными .