Каковы некоторые из проблем "Подразумеваемые глобальные переменные"?

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

foo = value;

В книге говорится: "Политика JavaScripts для создания забытых переменных global создает которые могут быть очень трудными для поиска ".

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

Ответы

Ответ 1

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

В 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] для доступа к кадру.

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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