Javascript, конвертирующий в пространство имен и вызывающий функции
Я типичный веб-разработчик, который используется глобально для всего в JS. Теперь я видел свет и хочу преобразовать в пространства имен. Так что в моем текущем проекте у меня есть страница, которая имеет три функции JS (все глобальные в настоящее время), которые при вызове присваивают текст якорям и прикрепляют методы щелчка, чтобы переключать видимость отдельных элементов div. Очень стандартный.
Итак, пример функции записывается так:
function toggleComments(){
$("comments-section").hide();
$("comments-button").click(function (){
blah
return false;
});
}
У меня вопрос, как мне создать пространство имен для хранения этих функций, а затем вызвать их?
Я нашел разные примеры, но ничего убедительного.
Любая помощь будет отличной.
2 ответа
Билли Мун показывает хорошее начало, но проблема с использованием объектных литералов заключается в том, что вы не можете перекрестно ссылаться на другие поля / функции / свойства.
Я очень предпочитаю шаблон раскрывающегося модуля (см. http://www.wait-till-i.com/2007/08/22/again-with-the-module-pattern-reveal-something-to-the-world/)
шаблон раскрывающего модуля объединяет самовыполняющуюся функцию, использование (своего рода) замыканий для обеспечения внутренних частных функций / полей и позволяет передавать параметры для инициализации объекта пространства имен.
var namespacedObject = function(param) {
var settings = param || someDefaultSetting, //default if no param supplied
somePrivateField = "someValue",
somePublicField = "i'm public";
//define some method we will later make public
function toggleComments(){
$("comments-section").hide();
$("comments-button").click(function (){
$(this).value= somePrivateField;
return false;
});
}
//this is where the magic happens,
//return object with all public fields/functions
return {
toggleComments : toggleComments,
somePublicField : somePublicField
};
}(someParam);
Вы можете видеть, что объект пространства имен содержит приватное поле somePrivateField
, на который можно ссылаться из общедоступных методов. Кроме того, обратите внимание, что я выставил открытое поле и принял некоторые параметры, которые я могу использовать / использовать в функциях и т. Д. (И вы можете установить по умолчанию его значение по умолчанию, если ничего не передано.
можно использовать так:
namespacedObject.toggleComments();
alert(namespacedObject.somePublicField);
alert(namespacedObject.somePrivateField); //undefined - it's private of course!
одна из причин, по которой мне это нравится, заключается в том, что очень легко увидеть, что является публичным / приватным, просто взглянув на литерал объекта, возвращаемый из выполняемой функции
Надеюсь, это полезно
// choos a namespace name that will not conflict with existing global variables
var myNS = {
toggleComments: function(){
$("comments-section").hide();
$("comments-button").click(function (){
// blah
return false;
});
},
anotherFunc: function(){
return "something";
}
}
// called like this
myNS.toggleComments();
alert( myNS.anotherFunc() );
Кроме того, вы должны попытаться поместить свой код в анонимную функцию самозапуска. Это означает, что вы не можете иметь ничего в глобальном пространстве имен, поэтому нет риска загрязнения.
// other peoples/modules code
var myVariable = "whatever";
// anonymous function for your self contained code
(function(){
var myVariable = "inside anonymous function";
alert(myVariable);
})() // the empty brackets envoke the anonymous function
// still retains value from before your self envoking anonymous function
alert(myVariable);