Javascript, раскрывающий шаблон модуля с несколькими файлами/модулями и глобальными переменными

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

Я пытаюсь использовать раскрывающийся шаблон модуля для javascript. У меня есть базовый файл js, содержащий методы и свойства, необходимые на каждой странице приложения.

Затем каждая страница имеет свой собственный файл js, который имеет свои собственные уникальные функции и переменные, но также должен ссылаться на переменные в базовом файле js.

Кажется, я действительно неправильно понимаю переменную область видимости, или то, как я это настраиваю, как-то очень плохо, потому что я получаю запутанные результаты.

Вопросы:

  1. Если я структурирую это неправильно, как правильно?
  2. Как я могу правильно обращаться к переменным в модулях?
  3. Правильно ли я инициализирую модули в doc?

Что я делаю прямо сейчас, так это:

var base = (function() {
    init = function() {
        url = $(location).attr('href');
        url = url.substr(-1) === '/' ? url.slice(0, -1) : url;

       segments = url.split('/');

        baseUrl = this.segments[0] + '//' + this.segments[2] + '/';

        resource = this.segments[3];

        this.segments = segments; //need access to this across all pages
        this.resource = resource;  //need access to this across all pages
        this.baseUrl = baseUrl;  //need access to this across all pages
    }
}

    doStuffGlobally = function() {
        //do stuff for all pages
    }

   return {
        init: init,
        baseUrl: this.baseUrl,
        segments: this.segments,
        resource: this.resource
  };
}());
$(document).ready(function() {
    base.init();
}

И на другой странице я делаю это:

var otherPage = (function() {
    init = function() {
      //do otherPage stuff;
    }
}
doStuff = function() {
    base.doStuffGlobally(); //need to access this.
    console.info(base.segments); //need to access this.
}

   return {
        init: init
  };
}());
$(document).ready(function() {
    otherPage.init();
}

Вы не вставили doStuffGlobally в объект base?

Bergi 24.02.2019 14:51
base.segments на самом деле должно работать, если предположить, что base.init() уже был вызван.
Bergi 24.02.2019 14:52

JS не имеет неявной области видимости переменных. Все ваши переменные, даже в шаблоне модуля IIFE и функции init, являются глобальными — вы должны объявить их с помощью var!

Bergi 24.02.2019 14:52
baseUrl: this.baseUrl, в этом объектном литерале не работает. На что, по-вашему, здесь ссылается this? И каким значением вы хотите инициализировать свойство?
Bergi 24.02.2019 14:55

По сути, я просто хочу, чтобы все было СУХИМ. Итак, для каждой страницы, на которую переходит пользователь, я хочу получить и разобрать URL-адрес в массив сегментов. Я хочу, чтобы эти переменные были доступны в других модулях, поэтому я не повторяюсь.

hyphen 24.02.2019 14:57

Конечно, но почему вы анализируете URL-адрес в этой функции init (которая не вызывается, пока дом не будет готов)? Было бы намного проще, если бы вы просто сделали это сразу при создании модуля.

Bergi 24.02.2019 14:58

да, я полагаю, вы правы. Я полагаю, что мой мыслительный процесс заключался в том, что функция init была похожа на конструктор, и я устанавливал все свои переменные объекта в этой функции. Как я уже сказал, я, вероятно, делаю это неправильно ..

hyphen 24.02.2019 15:00

Итак, я должен, возможно, настроить эти переменные в теге скрипта в заголовке или что-то в этом роде? Я не уверен в лучшем способе структурировать это..

hyphen 24.02.2019 16:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
8
226
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам не нужен метод init для вашего модуля base, ему не нужно ждать domready, но он может (и должен) запускаться немедленно. Так что пиши

var base = (function() {
    var url = $(location).attr('href');
    if (url.substr(-1) === '/') url = url.slice(0, -1);

    var segments = url.split('/');
    var baseUrl = this.segments[0] + '//' + this.segments[2] + '/';

    var resource = this.segments[3];

    function doStuffGlobally() {
        //do stuff for all pages
    }

    return {
        baseUrl,
        segments,
        resource,
        doStuffGlobal,
    };
}());

Другие вопросы по теме