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

30

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

JavaScript или другие языки менее важны. Здесьcanonical answer to why globals are bad. Dan Dascalescu
возможный дубликатWhy are globals bad? а такжеother questions. Felix Kling

Ваш Ответ

7   ответов
5

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

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

Более сложная отладка - это только одна из причин плохой глобальности. Другие перечислены вWhy are globals so evil.
12

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

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

35

чем локальные переменные.

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

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

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

0

войства объекта окна. Потому что глобальные переменные обращаются в глобальном контексте, то есть к объекту окна.

0

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

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

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

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

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

(конечно, всегда нужно правильно балансировать между локальными и глобальными переменными)

3

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

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

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

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

Похожие вопросы