Я извиняюсь, если это было задано в другом месте, но вся информация, которую я видел, на самом деле не помогает мне понять как ответ, так и передовой опыт.
Я пытаюсь использовать раскрывающийся шаблон модуля для javascript. У меня есть базовый файл js, содержащий методы и свойства, необходимые на каждой странице приложения.
Затем каждая страница имеет свой собственный файл js, который имеет свои собственные уникальные функции и переменные, но также должен ссылаться на переменные в базовом файле js.
Кажется, я действительно неправильно понимаю переменную область видимости, или то, как я это настраиваю, как-то очень плохо, потому что я получаю запутанные результаты.
Вопросы:
Что я делаю прямо сейчас, так это:
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();
}
base.segments на самом деле должно работать, если предположить, что base.init() уже был вызван.
JS не имеет неявной области видимости переменных. Все ваши переменные, даже в шаблоне модуля IIFE и функции init, являются глобальными — вы должны объявить их с помощью var!
baseUrl: this.baseUrl, в этом объектном литерале не работает. На что, по-вашему, здесь ссылается this? И каким значением вы хотите инициализировать свойство?
По сути, я просто хочу, чтобы все было СУХИМ. Итак, для каждой страницы, на которую переходит пользователь, я хочу получить и разобрать URL-адрес в массив сегментов. Я хочу, чтобы эти переменные были доступны в других модулях, поэтому я не повторяюсь.
Конечно, но почему вы анализируете URL-адрес в этой функции init (которая не вызывается, пока дом не будет готов)? Было бы намного проще, если бы вы просто сделали это сразу при создании модуля.
да, я полагаю, вы правы. Я полагаю, что мой мыслительный процесс заключался в том, что функция init была похожа на конструктор, и я устанавливал все свои переменные объекта в этой функции. Как я уже сказал, я, вероятно, делаю это неправильно ..
Итак, я должен, возможно, настроить эти переменные в теге скрипта в заголовке или что-то в этом роде? Я не уверен в лучшем способе структурировать это..



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам не нужен метод 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,
};
}());
Вы не вставили
doStuffGloballyв объектbase?