Могу ли я добавить атрибуты в объект "window" В javascript?

могу ли я добавить случайный атрибут в объект "window" В javascript? Что-то вроде:

window.my_own_attr = "my_value"

имеет ли он какие-либо побочные эффекты с любыми библиотеками? И это кросс-браузер совместимый?

6 ответов


могу ли я добавить случайный атрибут в объект "window" В javascript?

да, так же, как вы показали.

имеет ли он какие-либо побочные эффекты с любыми библиотеками?

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

и это кросс-браузер совместимый?

полностью да.


сказав Это, эта практика обычно с неодобрением. Ты можешь переписать то, что не хочешь.


на все браузеры, window - глобальное пространство имен javascript. Каждое свойство или метод "живет" в этом пространстве имен. Поэтому, если вы назначаете свойство window, это в силу глобальная переменная.

пример:

window.myConstant = 5;

function multiply(val){
  return myConstant * (val || 1);
}
multiply(10); //=> 50
multiply(); //=> 5

вы должны быть осторожны с фреймворками javascript. Например, если вы объявите window.JQuery, и использовать JQuery базы,JQuery пространство имен будет заменено на ваше задание, сделав его бесполезный.


да, можно, но в целом вы не должны.

на window object также является" глобальным " объектом JS по умолчанию, поэтому все глобальные переменные добавляются туда.

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


Я не буду повторять то, что другие сказали re: избитость этой практики. Но это может быть невероятно полезно при использовании жесткой структуры, такой как Angular, смешанный с кодом vanilla HTML / JS (или jQuery). Который также является хакерским и нахмурился, но иногда есть веские причины, например, если у вас есть много существующего кода JS, который будет сложно интегрировать в структуру.

более интересный вопрос для меня-как использовать возможность добавления свойств в мировой

  1. определите свой сервис в качестве поставщика в модуле верхнего уровня.
  2. в конструкторе или onInit приложения.деталь.js (или любой ваш компонент верхнего уровня, который импортирует поставщика), inject провайдер обычно выполняет любую одноразовую инициализацию, которая ему нужна, а затем вызывает window['MyServiceName'] = this

предполагая, что вы разработали поставщика, чтобы следовать одноэлементному шаблону, методы вашего поставщика теперь можно безопасно вызывать из любого места. Не угловой скрипт нужно просто вызвать window['MyServiceName'].methodName()


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


в IE если элемент имеет идентификатор, то этот узел доступен на объекте window как свойство:

<div id="num"></div>

alert(num); //Element

num = 3; //throws exception

var num = 3; //ok