Состояние частной переменной шаблона модуля выявления JavaScript

Недавно я начал работать над проектом 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'

На данный момент я очень смущен, как переменная, возвращаемая функцией получения, может иметь другое значение при прямом доступе к ней?

Чем вы заранее!

Поведение ключевого слова "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) для оценки ваших знаний,...
2
0
127
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Поскольку privateDomain является строкой, вы копируете / возвращаете не ссылку, а значение.

Поэтому, когда вы меняете домен с помощью функции init, он просто обновляет privateDomain, поскольку у domain нет ссылки на него, кроме как копии.

Надеюсь, поможет! :)

А, понятно. Я знал, что javascript передается по значению (как в Java), но думал, что, поскольку строки являются объектами, их переменные будут указывать на один и тот же строковый объект. Мне, вероятно, следует немного больше узнать о том, как строки обрабатываются в JS. Спасибо.

Konaras 25.07.2018 15:04

@Konaras Это познавательное путешествие, и я тоже начал с Java. Иногда разница довольно запутанная. Рад, что смог помочь! :) Также из-за своей случайной "странности" JS просто более мощный, по крайней мере, с моей точки зрения.

FatalMerlin 25.07.2018 15:07

Это потому, что когда возвращается домен, его значение по-прежнему остается "по умолчанию". Так работает Javascript, подробнее здесь: Javascript по ссылке или по значению

Но когда вы используете функцию «getDomain», вы получите обновленное значение.

Также обратите внимание на синтаксис get / set: Геттер

Да, это тоже правильный ответ. Спасибо. Также спасибо за информацию о синтаксисе получателя, кажется, это именно то, что мне нужно!

Konaras 25.07.2018 15:05

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