Вече задавам подобен въпрос: 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 и основният модул имат брояч в техния списък със зависимости? Ако това е правилно, test1 е "отговорен" за изпълнението на модула за брояч? И ако това е правилно, след изпълнение на брояча, в паметта ще има САМО ЕДИН обект, който ще бъде върнат от гишето? Когато test2 зареди брояча, той ще получи този ЕДИН обект? (с други думи test2 няма да изпълни отново код от counter нито main, те ще използват съществуващ counter object)? И така, създавам ли SINGLETON тук?
В крайна сметка всички модули могат да повлияят на стойността на брояча (в началото, брояч = 0) чрез функции (увеличаване, получаване) затваряния? Затварянията ще бъдат активни, докато броячът съществува в паметта?