Недавно я начал работать над проектом JavaScript, и, что неудивительно, вещи из мира Java временами кажутся странными.
Я реализовал простой модуль (с использованием шаблона раскрытия модуля, afaik), который предоставил бы конфигурацию на основе инициализации, но заметил, что после того, как «локальная» переменная domain назначается в функции init(), ее значение различается в зависимости от того, осуществляется ли к ней доступ через функцию «получения». getDomain() или напрямую через переменную domain, которая предоставляется через «общедоступный» API модулей.
См. Следующий сокращенный код, демонстрирующий проблему.
var ConfigManager = (function() {
var privateDomain = 'default';
function init(dom) {
privateDomain = dom;
}
function getDomain() {
return privateDomain;
}
return {
init: init,
domain: privateDomain,
getDomain: getDomain
};
})();
console.info(ConfigManager.domain); // Prints 'default'
console.info(ConfigManager.getDomain()); // Prints 'default'
ConfigManager.init('new domain');
console.info(ConfigManager.domain); // Prints 'default' <-- What??
console.info(ConfigManager.getDomain()); // Prints 'new domain'На данный момент я очень смущен, как переменная, возвращаемая функцией получения, может иметь другое значение при прямом доступе к ней?
Чем вы заранее!



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


Поскольку privateDomain является строкой, вы копируете / возвращаете не ссылку, а значение.
Поэтому, когда вы меняете домен с помощью функции init, он просто обновляет privateDomain, поскольку у domain нет ссылки на него, кроме как копии.
Надеюсь, поможет! :)
@Konaras Это познавательное путешествие, и я тоже начал с Java. Иногда разница довольно запутанная. Рад, что смог помочь! :) Также из-за своей случайной "странности" JS просто более мощный, по крайней мере, с моей точки зрения.
Это потому, что когда возвращается домен, его значение по-прежнему остается "по умолчанию". Так работает Javascript, подробнее здесь: Javascript по ссылке или по значению
Но когда вы используете функцию «getDomain», вы получите обновленное значение.
Также обратите внимание на синтаксис get / set: Геттер
Да, это тоже правильный ответ. Спасибо. Также спасибо за информацию о синтаксисе получателя, кажется, это именно то, что мне нужно!
А, понятно. Я знал, что javascript передается по значению (как в Java), но думал, что, поскольку строки являются объектами, их переменные будут указывать на один и тот же строковый объект. Мне, вероятно, следует немного больше узнать о том, как строки обрабатываются в JS. Спасибо.