Пространство имен Javascript - PullRequest
       38

Пространство имен Javascript

10 голосов
/ 07 октября 2011

Я хочу сделать свой javascript более модульным, разбив его на разные файлы и присвоив каждому файлу пространство имен 'sub', например:

subA.js

if(typeof ex == "undefined") {
    var ex = {};
}

ex.subA = function() {
//all functions of subA here
}

И то же самое для subB и т. Д.

На данный момент у меня есть 1 файл, ex.js

var ex = (function() {
    //private vars/funcs
    return {
        //public vars/funcs
    }
})();

Похоже, я должен двигаться больше всегоиз моих функций в subA.js и subB.js, но все еще включает ex.js в начале, с subA.js и subB.js позже.

У меня есть несколько вопросов.

  1. Мне трудно вспомнить, как я создал исходный файл пространства имен, например, js.Похоже, анонимная функция изначально предназначена для того, чтобы сделать все приватным, но я не могу вспомнить, почему ее нужно заключить в скобки, а затем сразу выполнить с (); в конце.

  2. Исходя из q1, должны ли мои подфайлы быть в том же формате, что и ex.js, т.е. иметь функцию anon, заключенную в круглые скобки и выполненную сразу?

  3. Itпохоже, что подфайлы будут иметь доступ только к публичным функциям ex, это правда?Если да, то как я могу разрешить своим суб-файлам доступ к закрытым функциям?

  4. В моем HTML-файле, в моей функции document.ready (jQuery), я должен инициализироватьex к переменной или я могу вызвать каждую функцию по отдельности, набрав

$(document).ready(function() {
    ex.doSomething();
    ex.doSomethingElse();
}

Есть ли разница между ними?Я думаю, что когда ex.js включен, глобальная переменная ex создается сразу (из-за того, что анонимная функция выполняется сразу), поэтому мне не нужно переопределять ее в document.ready.

  1. Первый оператор if в subA.js отличается от var ex = ex || {}; Что лучше?

  2. Какие стандарты стиля кода js вы используете?использовать?

Если вы прочитали все это, вы уже заслуживаете одобрения, ура.

Ответы [ 3 ]

5 голосов
/ 07 октября 2011

1.function(){ return{}} - это закрытие для добавления «конфиденциальности» к переменным и функциям, которые вы не хотите, чтобы они были доступны где-либо еще, кроме как в рамках этой функции.Скобки вокруг функции (function(){}) создают выражение функции.Они используются, потому что синтаксический анализатор будет жаловаться, когда вы попытаетесь выполнить функцию немедленно function(){}() без передачи аргумента ().

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

Вы можете сделать

ex.subA = function(x, y){
    return x+y;
}

, который можно назвать var sum = ex.subA(2, 3);

Или вы можете сделать

ex.subA = (function(){

    return {
        add: function(x, y){
            return x+y;
        },
        multiply: function(x, y){
            return x*y;
        }
    }
})();

Затем назовите его var sum = ex.subA.add(2, 3); var multiplication = ex.subA.multiply(2,3);

Есть много способов сделать это.

3.Да, это правда.Вы можете сделать частные функции общедоступными.Закрытие не позволит другим способом сделать это.

4.Если вы хотите использовать псевдоним, вы можете присвоить его переменной.Однако в этом нет необходимости.Он будет работать так, как вы его описываете.

Чтение Основные шаблоны пространств имен JavaScript , чтобы понять некоторые основы и шаблоны в пространстве имен javascript.


Первый оператор if в subA.js отличается от var ex = ex ||{};Что лучше?

Прежде всего, оператор if должен быть if(typeof ex == 'undefined'), typeof возвращает строку.Нет необходимости проверять, ложно ли ex.

Да, это не так.Оператор if не будет назначать переменные, если переменная ex уже определена.Таким образом, оператор if лучше.

Какие стандарты стиля кода js вы используете?

Зависит от объема проекта, но в основном это глубокий объект, расширяющийся с помощьювспомогательная функция.

2 голосов
/ 07 октября 2011

В вашем дизайне у вас не будет доступа к частным переменным vars / funcs, определенным в этой лямбда-функции, потому что она возвращает только объект или вы хотите использовать new?

1.Без (), ex является функцией, а не объектом, возвращаемым функциями.

2.не нужно, за исключением того, что вы хотите передать некоторые параметры для инициализации. например, * +1008 *

ex.my = (function(name) {var my_name = name;})('bar');

3. Я думаю, что вы имеете в виду этот частный метод.

ex = (function() {
    var foo = 'bar';
    return {
        show: function() {alert(foo);}
    }
})();

В случае выше, только ex может получить доступ к foo.

4.не нужно, $(document).ready() вызывается, когда все готово, если вы уже загрузили ex.js, инициализация завершена.

Все внутри него будет загружаться, как только DOM загружен и до загрузки содержимого страницы

0 голосов
/ 07 октября 2011

Для вопросов 1 и 3:

Определение стиля закрытия в ex.js позволит эти публичные функции и переменные / доступны.

Я думаю, что лучше возвращать "ex" из аномальной функции с функциями и переменными, которые мы должны раскрыть.

за 3 квартал. Эти (частные) переменные, определенные и используемые в возвращаемой функции, все еще доступны для функции и могут использоваться через открытую функцию (свойство замыкания).

Если внешний сценарий include находится в разделе или в верхней части файла, файл ex должен быть доступен до document.ready и должен использоваться сразу.

Вы заставляете меня задуматься :) Буду обновлять пост по мере того, как буду копаться в этом. Очень хорошие вопросы. :)

...