Книга: 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
окна.
- 17.3. Вызов обработчиков событий
- 22.4.2. Область видимости фонового потока
- Раздел VII Левиафан в Сети: защита права на тайну частной жизни после событий 2013 г.
- Расширение механизма событий
- Добавление цели в рабочую область для собраний
- Добавление повестки в рабочую область для собраний
- Добавление участников в рабочую область
- 17.3.6. Распространение событий
- Пример приложения Pocket PC, демонстрирующий работу средств контроля запуска событий
- 20.2.1. Атрибуты cookie: срок хранения и область видимости
- 1.4. Область применения Linux-серверов
- Применение событий