JavaScript: пространство имен против области - PullRequest
0 голосов
/ 30 апреля 2018

Я достаточно хорошо разбираюсь в понятиях области видимости и замыканий в JavaScript.

Кроме того, следующие сайты предоставляют примеры того, как можно реализовать пространства имен JavaScript:

  1. Все, что вы хотели знать о JavaScript JavaScript
  2. Пространство имен в JavaScript

Что я до сих пор не понимаю, так это то, как много людей, кажется, смешивают понятия объема и пространства имен. Кроме того, те же люди часто упоминают, как не следует «загрязнять глобальное пространство имен», а не «создавать глобальные переменные / переменные в глобальной области видимости».

Вопросы

  • Не правильно ли, что область видимости и пространство имен - это две совершенно разные концепции?
    • Пространство имен: группировка кода таким образом, что имена внутри группы являются уникальными и не могут конфликтовать с аналогичными именами в других пространствах имен
    • Область действия: определяет доступность переменных. JavaScript имеет две области: глобальную и локальную / функциональную область (в ES 2015 введена область видимости блока с let / const)
  • Правильно ли, что следующий литерал объекта создает новое пространство имен для bar, избегая загрязнения глобального пространства имен (за исключением foo), но bar все еще находится в глобальной области видимости: var foo = { bar: 42 }
  • Разве не правильно сказать "не создавайте глобальные переменные, чтобы не загрязнять глобальное пространство имен"? Глобальные и локальные переменные (область) отличаются от пространства имен. Как видно, вполне возможно экранировать переменную в новом пространстве имен и при этом иметь ее в глобальной области видимости.
  • Если исключение загрязнения глобального пространства имен является единственной причиной, по которой нам не следует создавать глобальные переменные, разве недостаточно просто создавать новые пространства имен и при этом сохранять все это глобальным?

1 Ответ

0 голосов
/ 30 апреля 2018

Разве не правильно, что область действия и пространство имен - это две совершенно разные концепции?

Я бы не сказал, что области и пространства имен совершенно не связаны. Если мы возьмем буквальное значение « namespace », это будет пробел различных имен - уникальных и не конфликтующих с именами из других пробелов, как вы говорите.

Область определенно формирует пространство имен в этом отношении - имена переменных различны и не вступают в противоречие с именами из других областей. Однако область действия является внутренней и недоступна извне, поэтому она не особенно интересна для организации вещей.

Объект также образует пространство имен - имена свойств различны и не конфликтуют с именами других объектов. Вот почему объекты используются для структурирования кода в модули, и это традиционное значение «пространства имен» в JavaScript.

Правильно ли, что следующий литерал объекта создает новое пространство имен для bar, избегая загрязнения глобального пространства имен (за исключением foo), но bar все еще находится в глобальной области видимости: var foo = { bar: 42 }

Нет, bar не является членом глобальной области. Это свойство какого-то объекта.

Разве не правильно сказать "не создавайте глобальные переменные, чтобы не загрязнять глобальное пространство имен"? Глобальные и локальные переменные (область) отличаются от пространства имен.

Глобалы немного особенные в JS: они оба являются свойствами глобального объекта и переменными в глобальной области видимости. Вот почему мы говорим о «глобальном пространстве имен», чтобы охватить все - и особенно подчеркнуть, что имена не должны вступать в противоречие.

Если исключение загрязнения глобального пространства имен является единственной причиной, по которой мы не должны создавать глобальные переменные, разве недостаточно просто создавать новые пространства имен и при этом сохранять все это глобальным?

Создание пространств имен, например {bar: 42} в приведенном выше примере, по-прежнему создает глобальные переменные: foo. Он просто создает меньше переменных - по одной на модуль. Также это создает определенное соглашение об именах, а именно, что глобальные переменные должны ссылаться на модули, а не на обычные переменные. Мы не будем использовать var i, increment, decrement;, но var counter = {i: …, increment(){…}, decrement(){…}};, и будем ссылаться на их назначение в названии counter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...