Почему плохо делать элементы глобальными переменными в Javascript?

Я слышал, что в JavaScript не рекомендуется делать элементы глобальными. Я не понимаю, почему. Это то, с чем IE не может справиться?

Например:

    div = getElementById('topbar');

person Alex    schedule 27.04.2009    source источник
comment
О чем ты говоришь? Обработчики событий? Глобальные переменные? Обработчики событий, прикрепленные через атрибуты on/event/= в разметке?   -  person Shog9    schedule 27.04.2009
comment
Вы имеете в виду глобальные переменные? Можете ли вы перефразировать свой вопрос или предоставить пример кода?   -  person Dave L    schedule 27.04.2009
comment
Извините, я имел в виду «элементы», такие как div = document.getElementById('topbar'), а не «события». Я исправлю свой вопрос.   -  person Alex    schedule 27.04.2009
comment
Я думаю, вы говорите о переменных в целом, а не об «элементах». В JavaScript переменные абсолютно одинаковы, независимо от того, что они содержат/на что указывают (например, элементы DOM, строки, массивы).   -  person Steve Harrison    schedule 28.04.2009


Ответы (4)


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

Я не большой фанат JS, поэтому я не смогу рассказать вам, почему именно события JS плохи, но Кристиан Хейлманн рассказывает о лучших практиках JS здесь, вы можете взглянуть. Также попробуйте поискать в Google "лучшие практики JS"

Изменить: Википедия о глобальных переменных, которые также могут относиться к вашей проблеме:

[глобальные переменные] обычно считаются плохой практикой именно из-за их нелокальности: глобальная переменная потенциально может быть изменена из любого места (если только они не находятся в защищенной памяти), и любая часть программы может зависеть от нее. Таким образом, глобальная переменная имеет неограниченный потенциал для создания взаимных зависимостей, а добавление взаимных зависимостей увеличивает сложность. См. Действие на расстоянии. Однако в некоторых случаях можно использовать глобальные переменные. Например, их можно использовать, чтобы избежать непрерывной передачи часто используемых переменных через несколько функций.

через http://en.wikipedia.org/wiki/Global_variable

person marcgg    schedule 27.04.2009

Это то, с чем IE не может справиться?

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

См. Хорошо играйте с другими.

person TStamper    schedule 27.04.2009

Я предполагаю, что под «событиями» вы подразумеваете обработку событий JavaScript (функции).

В общем, в JS нехорошо использовать более одной глобальной переменной. (Невозможно не использовать хотя бы один, если вы сохраняете какие-либо данные для будущего использования.) Это потому, что он сталкивается с той же проблемой, что и все пространство имен пытается решить - что, если вы написали метод doSomething(), а кто-то другой написал метод doSomething()?

Лучший способ обойти это — создать глобальную переменную, которая является объектом для хранения всех ваших данных и функций. Например:

var MyStuff = {};
MyStuff.counter = 0;
MyStuff.eventHandler = function() { ... };
MyStuff.doSomething = function() { ... };

// Later, when you want to call doSomething()...
MyStuff.doSomething();

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

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

person Dan Lew    schedule 27.04.2009
comment
О, извините, я имел в виду не «событие», а «элемент». Что-то вроде div = document.getElementById('topbar'). - person Alex; 27.04.2009

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

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

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

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

person yoav barnea    schedule 15.07.2012