Объявляя глобальную переменную в области видимости функции - вы прописываете даете доступ к ней из функции и для переменной доступ к функции (именно так в двух направлениях). При этом локальная изменения переменной влияет на значение глобальной, но и изменения глобально тоже влияют на значение переменной внутри функции.
При этом возникают непредвиденные ситуации, сложные к выявлению.
Например: Если при выполнении функции у вас случилось исключение . Обработчик исключения может с легкостью изменить глобальную переменную. Но если функция не учитывает эту "асинхронность", то
далее может случится все что угодно!!! - зацикливание, деление на ноль или, что еще хуже, случайное прохождение логики по другой ветке (которое будет сложно выявить)...
Последствия применения глобальных переменных самые плачевные:
- сложно обнаруживаемые ошибки;
- безопасность - "хромая на две ноги";
- сложности в рефакторинге и понимании кода;
- сложность в масштабировании стремящаяся к инифинимуму;
- не прогнозируемое значение переменной;
- возможная инициализация/реинициализация переменной в разных местах кода.
Что относится к косвенному вызову/привязке переменной или как это ещё называют "внедрение зависимостей" (Dependency injections) - значоком "&"...
Такая переменная может хранится в любой области видимости, а не только в глобальной. Но проблемы - те же, что и при использовании глобальной переменной, может даже и более усугубленные. Так как ещё более сложно выявление ошибок и возможна перелинковка таких параметров между разными функциями использующими друг-друга!
Принципы такие:
- Если вы используете глобальные переменные, то масштабируемость и отказоустойчивость кода будет скорее всего никакая. Код сразу в топку;
- Если косвенная привязка появляется в параметрах функции - это явный показатель того, что функция слишком сложна и скорее всего нужно разделить функцию на меньшие, или создать класс на основе этой функции, или разделить класс на составные.