Я уже задаю аналогичный вопрос: Requirejs, что это значит Requirejs загружает каждый модуль один раз
но в той теме никто не ответил на главный вопрос, т.к. я не так задал.
Итак, я приведу несколько простых примеров, чтобы показать, что я имею в виду:
Модуль counter.js
1: define([], function() {
2: console.log("Executing counter");
3: var counter = 0;
4:
5: return {
6: increment: function() { counter++; },
7: get: function() { return counter; }
8: };
9: });
Модуль test1.js
1: define(['counter'], function(counter) {
2: console.log("Executing test1");
3: counter.increment();
4: });
Модуль test2.js
1: define(['counter'], function(counter) {
2: console.log("Executing test2");
3: counter.increment();
4: });
Main.js
1: require(['test1', 'test2', 'counter'], function(test1, test2, counter) {
2: console.log("Executing main");
3: alert(counter.get());
4: });
Таким образом, модуль main.js является точкой входа приложения, которое сначала загружает зависимости «test1», «test2» и «counter». (Порядок выполнения: Выполнение счетчика, Выполнение теста1, Выполнение теста2, Выполнение основного)
Итак, если я понимаю предложение «Requirejs загружает каждый модуль один раз», это означает (например, counter.js), что код со строки 1 по 9 будет выполняться ТОЛЬКО ОДИН РАЗ, помимо того факта, что test1, test2 и основной модуль имеют counter в их списке зависимостей? Если это так, то test1 "отвечает" за выполнение модуля счетчика? И если это так, то после выполнения counter в памяти будет ТОЛЬКО ОДИН объект, который будет вернулся со стойки? Когда счетчик загрузки test2 получит этот ОДИН объект? (другими словами, test2 не будет снова выполнять код ни из счетчика, ни из основного, они будут использовать существующий объект счетчика)? Итак, я создаю SINGLETON здесь?
В конце концов, все модули могут влиять на значение счетчика (в начале счетчик = 0) через закрытие функций (приращение, получение)? Замыкания будут активны, пока объект счетчика существует в памяти?