Существует ли “краткий” способ сделать пространство имен в JavaScript?

Существует замена на основе стандартов, DOMContentLoaded, которая поддерживается более 98% браузеров , хотя не IE8:

document.addEventListener("DOMContentLoaded", function(event) { 
  //do work
});

Нативная функция jQuery намного больше сложнее, чем просто window.onload, как показано ниже.

function bindReady(){
    if ( readyBound ) return;
    readyBound = true;

    // Mozilla, Opera and webkit nightlies currently support this event
    if ( document.addEventListener ) {
        // Use the handy event callback
        document.addEventListener( "DOMContentLoaded", function(){
            document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
            jQuery.ready();
        }, false );

    // If IE event model is used
    } else if ( document.attachEvent ) {
        // ensure firing before onload,
        // maybe late but safe also for iframes
        document.attachEvent("onreadystatechange", function(){
            if ( document.readyState === "complete" ) {
                document.detachEvent( "onreadystatechange", arguments.callee );
                jQuery.ready();
            }
        });

        // If IE and not an iframe
        // continually check to see if the document is ready
        if ( document.documentElement.doScroll && window == window.top ) (function(){
            if ( jQuery.isReady ) return;

            try {
                // If IE is used, use the trick by Diego Perini
                // http://javascript.nwbox.com/IEContentLoaded/
                document.documentElement.doScroll("left");
            } catch( error ) {
                setTimeout( arguments.callee, 0 );
                return;
            }

            // and execute any waiting functions
            jQuery.ready();
        })();
    }

    // A fallback to window.onload, that will always work
    jQuery.event.add( window, "load", jQuery.ready );
}

14
задан Stephen King 20 April 2018 в 11:50
поделиться

7 ответов

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

Вот Ваш пример, исправленный:

var namespaces = { com: { example: { /* example.com's data */ } } }

Это - переменная namespaces присваиваемый литерал объектов. Объект содержит одно свойство: com, объект с одним свойством: example, объект, который, по-видимому, содержал бы что-то интересное.

Так, можно ввести что-то как [1 115] namespaces.com.example. somePropertyOrFunctionOnExample и это будут все работать. Конечно, это также смешно. У Вас нет иерархического пространства имен, у Вас есть объект, содержащий объект, содержащий объект с материалом, о котором Вы на самом деле заботитесь.

var com_example_data = { /* example.com's data */ };

, Который работает точно также без бессмысленной иерархии.

Теперь , если Вы на самом деле хотите создать иерархию, можно попробовать что-то вроде этого:

com_example = com_example || {};
com_example.flags = com_example.flags || { active: false, restricted: true};

com_example.ops = com_example.ops || (function()
    {
       var launchCodes = "38925491753824"; // hidden / private
       return {
         activate: function() { /* ... */ },
         destroyTheWorld: function() { /* ... */ }
       };
    })();

..., который, по моему скромному мнению, довольно краток.

19
ответ дан 1 December 2019 в 06:28
поделиться

Здесь была интересная статья Peter Michaux на Пространство имен JavaScript . Он обсуждает 3 различных типов пространства имен JavaScript:

  1. Пространство имен Префикса
  2. Пространство имен Отдельного объекта
  3. Пространство имен Вложенного объекта

я не буду незаконно заимствовать то, что он сказал здесь, но я думаю, что его статья очень информативна.

Peter даже пошел, насколько указать, что существуют соображения производительности с некоторыми из них. Я думаю, что эта тема была бы интересна говорить о рассмотрении, что новые планы Гармонии ECMAScript отбросили 4,0 плана относительно пространства имен и упаковки.

12
ответ дан 1 December 2019 в 06:28
поделиться

Я пытаюсь следовать конвенции Yahoo разбирания объекта родителя-одиночки в глобальной области видимости для содержания всего;

var FP = {};
FP.module = {};
FP.module.property = 'foo';
6
ответ дан 1 December 2019 в 06:28
поделиться

Для проверки Вы не перезаписываете существующий объект, Вы должны так что-то как:

if(!window.NameSpace) {
    NameSpace = {};
}

или

var NameSpace = window.NameSpace || {};

Этот путь можно поместить это наверху каждого файла в приложении/веб-сайте, не волнуясь о перезаписи объекта пространства имен. Кроме того, это позволило бы Вам записать модульные тесты на каждый файл индивидуально.

5
ответ дан 1 December 2019 в 06:28
поделиться

Библиотека YUI библиотека имеет код, который обрабатывает пространство имен с помощью функции, которую можно найти предпочтительным. Другие библиотеки могут сделать это также.

3
ответ дан 1 December 2019 в 06:28
поделиться

Как альтернатива точке или подчеркиванию, Вы могли использовать символ знака доллара:

var namespaces$com$example = "data"; 
1
ответ дан 1 December 2019 в 06:28
поделиться

Мне также нравится это ( источник ):

(function() {
    var a = 'Invisible outside of anonymous function';
    function invisibleOutside() {
    }

    function visibleOutside() {
    }
    window.visibleOutside = visibleOutside;

    var html = '--INSIDE Anonymous--';
    html += '<br/> typeof invisibleOutside: ' + typeof invisibleOutside;
    html += '<br/> typeof visibleOutside: ' + typeof visibleOutside;
    contentDiv.innerHTML = html + '<br/><br/>';
})();

var html = '--OUTSIDE Anonymous--';
html += '<br/> typeof invisibleOutside: ' + typeof invisibleOutside;
html += '<br/> typeof visibleOutside: ' + typeof visibleOutside;
contentDiv.innerHTML += html + '<br/>';​
1
ответ дан 1 December 2019 в 06:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: