Могу ли я добавить атрибуты в объект "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, который будет сложно интегрировать в структуру.
более интересный вопрос для меня-как использовать возможность добавления свойств в мировой
- определите свой сервис в качестве поставщика в модуле верхнего уровня.
- в конструкторе или 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