2015-11-12 2 views
2

Я читал исходный код библиотеки, который должен оставаться анонимным, и я вижу, что он использует пустую функцию для настройки пространства имен. Он, похоже, похож на объектную нотацию (OLN), за исключением того, что базой является функция.Зачем использовать пространство имен javascript как функцию?

Вот пример декларации.

/** 
* Base namespace for FOO library 
* @name FOO 
* @namespace 
*/ 
function FOO(){} 

FOO.bar = 'bar const..'; 
FOO.fooFunc = function() { /* code */ }; 
FOO.Bar = function() { /* some constructor */ }; 
FOO.Bar.prototype.baz = function() { /* A prototype method on FOO.Bar */ }; 
... 

Как вы можете видеть, пространство имен FOO является пустой функцией. Есть ли смысл объявлять пространство имен как пустую функцию? Является ли это неправильным использованием шаблона OLN? Похоже, что это, возможно, начало фабричной модели. В пространстве имен нет прототипов (например, FOO.prototype.bar = ...). Вызов FOO() явно ничего не делает. Кто-нибудь признает этот шаблон?

ответ

1

Названные функции hoisted - эффективно перемещается к верхней части их области видимости. Использование имени функции может позволить назначение до имен объявляется:

FOO.bar = "bar"; 
function FOO() {} 
console.log(FOO.bar); // bar 

По сравнению с литерала объекта (или не по имени функции):

FOO.bar = "bar"; 
var FOO = {}; 
console.log(FOO.bar); // undefined 

Маловероятно, что кто-то будет план назначить членов в пространство имен, подобное этому, но это может произойти.

Единственное другое преимущество, которое я могу придумать, состоит в том, что функции могут иметь имя , которое имеет значение, что может быть полезно для отладки.

Например, если члены пространства имен имели namespace свойство (что они, вероятно, нет):

function FOO(){} 
FOO.bar = { namespace: FOO }; 
console.log(FOO.bar.namespace); // function FOO(){} 

По сравнению с:

var FOO = {}; 
FOO.bar = { namespace: FOO }; 
console.log(FOO.bar.namespace); // Object {bar: Object} 

Чисто предположение: это также возможно, что некоторые пространства имен может используйте такую ​​функцию для инициализации. Это может быть пример пространства имен, которое не нуждается в какой-либо инициализации, но предпочитает использовать функцию для согласованности.

+0

Это оба хорошие моменты. Хотя, я не вижу, чтобы библиотека использовала подъем. – alex

+0

Я полагаю, что он сохраняет 'FOO || (FOO = function() {}) 'type проверяет, объединены ли модули в одну область с неизвестным порядком. – joews

0

я обычно вижу это делается следующим образом:

var FOO = FOO || {}; 

Так что глобальный не переписывается.

Зачем объявлять пустую функцию?

Таким образом, автор может затем добавить методы в FOO. Это всего лишь один способ сделать это, потому что в JavaScript большинство объектов, включая функции, являются объектами.

Пожалуйста, ознакомьтесь с этим для лучшего объяснения: How is almost everything in Javascript an object?

+0

Вот как я обычно это делаю. Конечно, функция - это объект, но мне интересно, может ли объявление пространства имен как функции предоставлять какую-либо пользу. – alex

Смежные вопросы