Книга: JavaScript. Подробное руководство, 6-е издание

17.3.3. Область видимости обработчика событий

17.3.3. Область видимости обработчика событий

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

Особый случай представляют обработчики событий, которые регистрируются посредством HTML-атрибутов. Они преобразуются в функции верхнего уровня, которые не имеют доступа ни к каким локальным переменным - только к глобальным. Но по историческим причинам они выполняются в модифицированной цепочке областей видимости. Обработчики событий, определяемые посредством HTML-атрибутов, могут использовать свойства целевого объекта, объемлющего элемента <form> (если таковой имеется) и объекта Document, как если бы они были локальными переменными. В разделе 17.2.2 было показано, как из HTML-атрибута создается функция обработчика события, программный код в которой использует цепочку областей видимости, модифицированную с помощью инструкций with.

HTML-атрибуты плохо подходят для включения длинных строк программного кода, и такая модифицированная цепочка областей видимости помогает сократить его. Она позволяет использовать tagName вместо this.tagName, getElementByld вместо document.getElementByld, а в обработчиках, привязанных к элементам документа внутри элемента <form>, можно ссылаться на другие элементы формы по значению атрибута id, используя, например, имя zipcode вместо this.form.zipcode.

С другой стороны, модифицированная цепочка областей видимости обработчика событий, определяемого с помощью HTML-атрибута, может стать источником ошибок, потому что свойства всех объектов в цепочке видимости скрывают одноименные свойства глобального объекта. Например, объект Document определяет (редко используемый) метод ореn(), поэтому если обработчику событий, созданному с помощью HTML-атрибута, потребуется вызвать метод ореn() объекта Window, он вынужден будет явно вызывать его как window.ореn(), вместо ореn(). Аналогичная (но более пагубная) проблема наблюдается при работе с формами, потому что имена и значения атрибутов id элементов формы определяют свойства во вмещающем элементе формы (раздел 15.9.1). То есть если, к примеру, форма содержит элемент со значением «location» атрибута id, все обработчики событий, созданные внутри этой формы с помощью HTML-атрибутов, должны будут использовать window.location вместо location, если им потребуется сослаться на объект Location окна.

Оглавление книги


Генерация: 1.254. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз