2016-12-22 2 views
0

Может кто-нибудь объяснить, как сделать это правильноJavascript Пространства имен и неопределенная функция

foo(); //outputs 'foo' 

function foo(){ 
    console.log('foo'); 
} 

, но это дает «функция не определена» Ошибка

MY_NAME_SPACE ={}; 

MY_NAME_SPACE.foo(); //undefined 

MY_NAME_SPACE.foo = function(){ 
    console.log('foo'); 
}  

Я могу видеть, что во втором примере, вызов было сделано до того, как функция была добавлена ​​в объект My_NAME_SPACE, но если это так, как бы использовать этот тип «пространства имен», если важно упорядочение?

+0

Чтобы быть немного более ясным ... Я знаю, что эта ошибка происходит, потому что я вызываю функцию до того, как она была объявлена ​​/ добавлена ​​в объект. Тем не менее, я читал об использовании этого типа «namespacing», чтобы избежать функций с повторяющимися именами и т. Д., Но, похоже, вам теперь нужно беспокоиться о заказе на ваш код/​​функции? – fredmarks

+0

Вы просто * не будете * использовать пространство имен, прежде чем создавать его? – Bergi

ответ

1

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

Вместо определения объекта пространства имен, а затем определение каждого последовательного метода в пространстве имен, например:

var MY_NAME_SPACE = {}; 

MY_NAME_SPACE.foo = function() { 
    console.log('foo'); 
} 

Я предпочитаю использовать то, что называется как module pattern, так как методы, которые я хочу, содержащихся в MY_NAME_SPACE визуально завернутые в модуле:

var MY_NAME_SPACE = (function() { 

    var foo = function() { 
     console.log('foo'); 
    }; 

    return { foo: foo }; 

})(); 


MY_NAME_SPACE.foo() 

Кроме того, если методы, которые вы хотите, чтобы завернуть в пространстве имен или модуля независимы и многоразовые, он бы имеет смысл создать отдельный файл, может быть my_name_space.js и включить этот файл в проекты, которым необходим доступ к методам в MY_NAME_SPACE (API MY_NAME_SPACE).