Учитывая пространства имен ns
используемый в двух различных файлах:
ns = ns || (function () {
foo = function() { ... };
return {
abc : foo
};
}());
// is this correct?
ns = ns || {}
ns.def = ns.def || (function () {
defoo = function () { ... };
return {
deFoo: defoo
};
}());
Это надлежащий способ добавить def
к ns
к пространству имен? Другими словами, как каждый объединяет два вклада в пространство имен в JavaScript?
Если abc.js
прибывает прежде def.js
Я ожидал бы, что это будет работать. Если def.js
прибывает прежде abc.js
Я ожидал бы ns.abc
не существовать потому что ns
определяется в то время.
Кажется, что должен быть шаблон разработки для устранения любой неуверенности в выполнении включений с шаблоном пространства имен JavaScript.
Я ценил бы мысли и вход о том, как лучше всего пойти об этом виде 'включения'.
Спасибо за чтение.
Brian
Это определенно сработает. Однако имейте в виду, что этот исходный порядок повлияет на вашу реализацию: если def.js когда-либо окажется включенным до abc.js, ваше определение foo и ns.abc никогда не будет выполнено.
Взгляните на старую функцию пространства имен YUI для примера : они проверяют либо использование существующего объекта, либо инициализацию нового объекта, вероятно, по указанной выше причине.
Это может очень помочь вам разделить ваши модули примерно так:
ns = ns || {};
ns.abc = function(){ ... }();
and
ns = ns || {};
ns.def = function() ... }();
Таким образом, каждый будет отдельным модулем, порядок исходных текстов не имеет значения, и каждый имеет доступ к своему собственному закрытию, как у вас в ваш пример.