В чем разница между этими двумя подходами к пространству имен? - PullRequest
2 голосов
/ 13 февраля 2012

У меня есть первый файл в моей директории с кодом следующим образом

myNamespace.js

var myNamespace = {};

Тогда мои последующие файлы могут выглядеть как один издва следующих способа.

первый

(function (ns) {
    ns.DoStuff = function(){
        // do stuff
    }
})(myNamespace);

второй

myNamespace.DoStuff = function(){
    //do stuff
}

Так в чем же разница между этими двумяметоды?Оба, кажется, работают для меня.Существует ли более общепринятая конвенция?

извините, я все еще не знаком с javascript

Ответы [ 2 ]

3 голосов
/ 13 февраля 2012

Ваш первый подход не будет работать. Это создаст DoStuff на global object (скорее всего window). Вам нужно будет заменить this на ns, после того, как вы это сделаете, между двумя подходами нет никакой разницы.

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

(function (ns) {
    var foo = 10,
        bar = 42;

    ns.DoStuff = function(){
        console.log('foo is ', foo, ' and its not available globally');
    }
})(myNamespace);
2 голосов
/ 13 февраля 2012

У вас есть ошибка в первом, вы использовали this, где я почти уверен, что вы имели в виду ns:

ns.DoStuff = function() {
};

Если оставить в стороне, ваш первый подход имеет тенденцию бытьлучше, потому что вы создали для себя небольшую небольшую функцию определения объема, которая позволяет вам иметь частные данные и функции, доступные для всех открытых методов, которые вы создаете в своем пространстве имен, не делая их глобальными.Например:

(function(ns) {
    function privateFunction() {
    }

    ns.DoStuff = function() {
        privateFunction();   // <=== works fine
    };

})(myNamespace);]
privateFunction(); // <=== doesn't work, because it's private

Мне нравится делать это таким образом частично, потому что Я имею дело с анонимными функциями , и поэтому я бы не определил DoStuff как выше, а скорее так:

(function(ns) {
    ns.DoStuff = Namespace$DoStuff;
    function Namespace$DoStuff() {
    }
})(myNamespace);

Теперь функция, которую я назначил для myNamespace.DoStuff, имеет правильное имя, которое помогает мне при отладке кода.Но это имя не загрязняет глобальное пространство имен, что помогает мне оставаться в здравом уме и избегать конфликтов с другим кодом.

...