Подтвердить что ты не робот

Почему глобальные переменные считаются плохой практикой?

Я продолжаю видеть предупреждения о том, чтобы не использовать глобальные переменные в JavaScript, но кажется, что единственная причина, по которой люди говорят, что это потому, что забивает глобальное пространство имен. Я могу представить, что это легко устранить, поставив все переменные в один большой объект. Теперь возникает вопрос: есть ли другие причины не использовать глобальные переменные, кроме удобства? Есть ли проблемы с производительностью или совместимостью с ними?

4b9b3361

Ответ 1

Они загромождают глобальное пространство имен и медленнее ищут локальные переменные.

Прежде всего, наличие многих глобальных переменных всегда плохо, потому что легко забыть, что вы где-то объявили переменную и случайно повторно объявили ее где-то в другом месте. Если ваша первая переменная была локальной, тогда у вас нет проблемы. Если он был глобальным, он просто перезаписывался. Это становится еще хуже, когда вы попадаете в подразумеваемые глобальные переменные (например, когда вы говорите someVar = someValue без объявления someVar с ключевым словом var).

Во-вторых, глобальные переменные занимают больше времени, чтобы Javascript "находил", чем локальные переменные. Разница в скорости не огромна, но она существует.

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

Ответ 2

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

Это фантастическая статья, излагающая, почему глобальные переменные вызывают головные боли.

Ответ 3

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

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

Ответ 4

В двух словах глобальные переменные вызывают (и более) следующие проблемы.

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

2) Безопасность. В частности, в Интернете каждый пользователь имеет доступ к объекту Window (или глобальному). Помещая переменные в глобальную область, вы даете любому пользователю возможность видеть или изменять переменные.

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

Ответ 5

Не должно быть никаких проблем с использованием глобальных переменных в вашем коде, если вы их обертываете внутри uniqe namespase/object (чтобы избежать столкновения со сценариями, которые не являются вашими)

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

Я лично считаю это очень полезным и, безусловно, имеет место в моем коде.

(разумеется, нужно всегда делать правильный баланс между переменными locals и globals)

Ответ 6

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

(function(){
    var foo = 'foo',//Local
    bar = 'bar';//Local
    window.globalVar = foo + bar;//Global
})();
alert(foo);//Error
alert(bar);//Error
alert(globalVar );//'foobar'

Ответ 7

Созданная глобальная переменная может переписать существующие свойства объекта окна. Поскольку глобальные переменные доступны в глобальном контексте, то есть в объекте window.