Почему я не должен использовать глобальные переменные в JavaScript для чего-то постоянного? - PullRequest
3 голосов
/ 09 августа 2011

Я слышал, что глобальные переменные в JavaScript плохие, и я могу понять некоторые проблемы с пространством имен и т. Д. Но почему я не должен использовать глобальную переменную для чего-то, что никогда не изменяется в скрипте - например,Дата?(Разумеется, что меняется изо дня в день, но только когда-либо на него ссылаются, а не на протяжении всего сценария.)

Ответы [ 3 ]

7 голосов
/ 09 августа 2011

Вы можете использовать глобальные переменные, если они защищены в том, что, по вашему мнению, является уникальным пространством имен и используются только тогда, когда это полезно. Основная проблема заключается в том, что глобальные переменные могут сделать один фрагмент кода более вероятным конфликтом с некоторым другим фрагментом кода (если не использовать другие пространства имен или очень уникальные имена). По этой и другим причинам, лучше избегать глобальных переменных, когда они на самом деле не нужны (когда переменные, объявленные локальными для некоторой области, будут работать так же хорошо), но все же есть некоторые подходящие причины иметь глобальные переменные. Суть образования в том, что многие люди используют глобалы, когда они просто не нужны. Если они вам нужны или вы считаете, что они более эффективны, вы можете использовать их без проблем, если вы защищаете пространство имен от случайного столкновения.

Я лично создаю один глобальный объект верхнего уровня и вешаю все остальные глобальные объекты на этот один объект.

Некоторые другие проблемы с глобалами:

  1. Они медленнее обращаются в Javascript, чем локальные, потому что они являются последними найденными, когда интерпретатор ищет заданное имя переменной в различных областях, в которых оно может существовать. Обычно это не заметная проблема, но что-то, о чем следует знать , Вот jsperf , показывающий, какая разница может быть.
  2. Если у вас есть какой-либо асинхронный код, который изменяет глобальные переменные, или код, управляемый таймером, который изменяет глобальные переменные, и более чем одна асинхронная операция может выполняться одновременно, несколько асинхронных операций могут наступать друг на друга посредством модификации одного и того же Глобал.
  3. Глобальные переменные часто не объявляются вблизи точки использования, поэтому чтение кода может быть более сложным.
  4. Глобальные переменные обычно не отображаются автоматически в отладчике (как локальные переменные), что делает отладку немного менее удобной.
  5. IE автоматически определяет группу глобальных переменных на основе некоторых имен в DOM, которые могут конфликтовать с вашими глобальными переменными, даже если вы этого не понимаете.
  6. Простое пропускание ключевого слова «var» в локальной переменной делает его глобальной переменной и может привести к путанице в коде, если это имя уже используется в качестве предполагаемой глобальной переменной. Я видел, как это происходило на конструкции for (i = 0; i < m.length; i++) раньше. Может быть трудно отследить, что не так.
  7. Глобальные переменные сохраняются на протяжении всего сценария. Если кто-то использует глобальную переменную для хранения ссылки на объект для чего-то, что не должно существовать в течение всего срока действия сценария, это может привести к тому, что сценарий будет использовать больше памяти, чем это было бы в противном случае.
  8. Глобальные переменные в браузере существуют в области видимости объекта window, поэтому они могут конфликтовать не только с другими глобальными переменными, но и с чем-либо еще в объекте window.
2 голосов
/ 09 августа 2011

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

0 голосов
/ 09 августа 2011

Вы не должны использовать глобальные переменные в javascript из-за возможных конфликтов с другими скриптами.Например, вы пишете плагин jQuery.Ваши глобальные переменные могут перезаписывать глобальные переменные из другого скрипта.

Таким образом, чтобы свести к минимуму эту возможность перезаписи, вы должны использовать только одну глобальную переменную.Если вы используете jQuery, вы не должны использовать глобальные переменные вообще.Вы можете расширить глобальный объект $.Например:

$.extend({
    something: your_app_variable
});

Если вы используете чистый javascript, вам следует использовать проблему с пространством имен.Создайте только одну глобальную переменную для вашего приложения.Все остальные переменные будут только свойствами этой глобальной переменной.Например:

// if APP doesn't exist creating it
APP = APP || {};
APP.some_method = function(){}
APP.some_property = 3;

UPD: помните, что вы должны объявлять переменные с var.Если объявленная переменная не будет глобальной.Ошибки, вызванные забыванием ключевого слова var, трудно уловить

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