Javascript, конвертирующий в пространство имен и вызывающий функции - PullRequest
1 голос
/ 12 августа 2011

Я типичный веб-разработчик, который используется глобально для всего в JS. Я теперь видел свет и хочу преобразовать в пространства имен. Так что в моем текущем проекте у меня есть страница, которая имеет три функции JS (все глобальные в настоящее время), которые при вызове присваивают текст якорям и прикрепляют методы щелчка, чтобы переключать видимость отдельных элементов div. Очень стандартный.

Итак, пример функции записывается так:

function toggleComments(){
   $("comments-section").hide();
   $("comments-button").click(function (){
      blah
      return false;
   });
}

Мой вопрос: как мне создать пространство имен для хранения этих функций и затем вызвать их?

Я нашел разные примеры, но ничего убедительного.

Любая помощь будет отличной.

Ответы [ 2 ]

2 голосов
/ 12 августа 2011
// 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);
1 голос
/ 12 августа 2011

Билли Мун показывает хорошее начало, но проблема с использованием литералов объекта в том, что вы не можете перекрестно ссылаться на другие поля / функции / свойства.

Я очень предпочитаю шаблон раскрывающегося модуля (см. http://www.wait -till-i.com / 2007/08/22 / снова с модулем-шаблоном-раскрыть что-то миру) / )

шаблон раскрывающего модуля объединяет самовыполняющуюся функцию, использование (своего рода) замыканий для предоставления внутренних закрытых функций / полей и позволяет передавать параметры для инициализации вашего пространства имен.

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!

одна из причин, по которой мне это нравится, в том, что очень легко увидеть, что является публичным / приватным, просто взглянув на литерал объекта, возвращаемый из самовыполняющейся функции

Надеюсь, это полезно

...