Каковы некоторые из проблем «подразумеваемых глобальных переменных»? - PullRequest
13 голосов
/ 05 февраля 2011

JavaScript: Хорошие части определяет эти типы объявлений как плохие:

foo = value;

В книге говорится, что "политика JavaScript по созданию глобальных забытых переменных создает ошибки, которые могут быть очень труднымиfind. "

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

Ответы [ 5 ]

14 голосов
/ 06 февраля 2011

Как обсуждалось в комментариях к этому ответу , установка определенных значений может иметь неожиданные последствия.

В Javascript это более вероятно, потому что установка глобальной переменной фактически означает установку свойстваwindow объект.Например:

function foo (input) {
    top = 45;
    return top * input;
}
foo(5);

Возвращает NaN, потому что вы не можете установить window.top, а умножение объекта window не работает.Изменение на var top = 45 работает.

Другие значения, которые вы не можете изменить, включают document.Кроме того, существуют другие глобальные переменные, которые, когда установлены, делают захватывающие вещи.Например, настройка window.status обновляет значение в строке состояния браузера, а window.location переходит в новое местоположение.

Наконец, если вы обновите некоторые значения, вы можете потерять некоторые функции.Если, например, вы установили window.frames в строку, например, вы не можете использовать window.frames[0] для доступа к кадру.

4 голосов
/ 06 февраля 2011

Глобальные переменные очень затрудняют изоляцию вашего кода и его повторное использование в новых контекстах.

Точка № 1: Если у вас есть объект Javascript, который опирается на глобальную переменную. вы не сможете создать несколько экземпляров этого объекта в вашем приложении, потому что каждый экземпляр будет изменять значение глобальных, тем самым перезаписывая данные, ранее записанные другим экземпляром. (Если, конечно, эта переменная не содержит значения, которое является общим для всех экземпляров, но чаще всего вы обнаружите, что такое предположение неверно).

Точка № 2: Глобальные возможности затрудняют использование существующих частей кода и их повторное использование в новых приложениях. Предположим, у вас есть набор функций, определенных в одном файле, и вы хотите использовать их в другом файле (в другом приложении). Таким образом, вы извлекаете их в новый файл и включаете этот файл в новое приложение. Если эти функции зависят от глобального, ваше второе приложение не будет работать во время выполнения, потому что глобальная переменная отсутствует. Зависимость от глобальных переменных не видна в коде, поэтому вероятна опасность забыть эти переменные (при перемещении функций в новые файлы).

1 голос
/ 06 февраля 2011

Это глобальные переменные, так что да, применимы все «обычные опасности». Главное, что отличает их от глобальных переменных в других языках, это то, что:

  • Вы явно не объявляете их в глобальной области видимости. Если вы ошибочно опустите var в объявлении переменной, вы случайно объявили глобальную переменную. JavaScript делает слишком легким непреднамеренное объявление глобальных переменных; сопоставьте это со схемой, которая вызывает ошибку, если переменная не определена в глобальной области видимости.
  • Глобальные переменные, по крайней мере, в браузере, имеют псевдоним window[variable_name]. Это потенциально беспокоит. Например, часть вашего кода может получить доступ к window['foo'] (с целью доступа к глобальной переменной). Затем, если вы случайно набрали foo вместо var foo в другом месте программы, вы объявили ссылку на window['foo'], которую вы хотели сохранить отдельно.
0 голосов
/ 06 февраля 2011

Проблема типичных глобальных переменных заключается в том, что они, ну, в общем, глобальные - нет возможности их заключить, и любой код, с которым вы выполняете / взаимодействуете (например, библиотека, которую вы вызываете в будущем), может измениться. переменная без предупреждения.

Однако эти проблемы в Javascript усугубляются двумя вещами:

  1. Вы можете определить глобальную переменную где угодно - единственное требование для этого - забыть ключевое слово var.
  2. Чрезвычайно легко определить глобальную переменную, когда вы не собирались это делать. Это проблема, которая возникает у «подразумеваемых» глобалов над «типичными» глобалами - вы создадите их, даже не зная, что сделали.

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

0 голосов
/ 06 февраля 2011

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

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

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

...