JavaScript. Подробное руководство, 6-е издание, стр. 255
<b>function handler(event) {</b><b> event = event || window.event;</b><b> // Здесь находится реализация обработчика</b><b>}</b>Объект события передается обработчикам событий, зарегистрированным с помощью метода
<b>attachEvent(),</b><b>window.event</b>В разделе 17.2.2 говорилось, что при регистрации обработчика события посредством HTML-атрибута броузер преобразует строку с программным кодом на языке JavaScript в функцию. Броузеры, отличные от IE, создают функцию с единственным аргументом
<b>event</b><b>event</b><b>window.event</b><b>event</b>17.3.2. Контекст обработчиков событий
Когда обработчик событий регистрируется установкой свойства, это выглядит как определение нового метода элемента документа:
<b>e.onclick = function() { /* реализация обработчика */ };</b>Поэтому нет ничего удивительного, что обработчики событий вызываются (с одним исключением, касающимся IE, которое описывается ниже) как методы объектов, в которых они определены. То есть в теле обработчика событий ключевое слово
<b>this</b>В обработчиках ключевое слово
<b>this</b><b>addEventListener().</b><b>attachEvent()</b><b>attachEvent(),</b><b>this</b><b>Window</b><b>/*</b><b>* Регистрирует указанную функцию как обработчик событий указанного типа в указанном</b><b>* объекте. Гарантирует, что обработчик всегда будет вызываться как метод целевого объекта.</b><b>*/</b><b>function addEvent(target, type, handler) {</b><b> if (target.addEventListener)</b><b> target.addEventListener(type, handler, false);</b><b> else</b><b> target.attachEvent(“on" + type,</b><b> function(event) {</b><b> // Вызвать обработчик как метод цели,</b><b> // и передать ему объект события</b><b> return handler.call(target, event);</b><b> });</b><b>}</b>Обратите внимание, что обработчики событий, зарегистрированные таким способом, нельзя удалить, потому что ссылка на функцию-обертку, передаваемую методу
<b>attachEvent(),</b><b>detachEvent()</b>17.3.3. Область видимости обработчика событий
Подобно всем функциям в языке JavaScript, обработчики событий имеют лексическую область видимости. Они выполняются в той области видимости, в какой были определены, а не в той, где они были вызваны, и имеют доступ ко всем локальным переменным в этой области видимости. (Это, например, демонстрируется в функции
<b>addEvent(),</b>Особый случай представляют обработчики событий, которые регистрируются посредством HTML-атрибутов. Они преобразуются в функции верхнего уровня, которые не имеют доступа ни к каким локальным переменным - только к глобальным. Но по историческим причинам они выполняются в модифицированной цепочке областей видимости. Обработчики событий, определяемые посредством HTML-атрибутов, могут использовать свойства целевого объекта, объемлющего элемента
<b><form></b><b>Document</b><b>with</b>HTML-атрибуты плохо подходят для включения длинных строк программного кода, и такая модифицированная цепочка областей видимости помогает сократить его. Она позволяет использовать
<b>tagName</b><b>this.tagName</b><b>getElementByld</b><b>document.getElementByld</b><b><form>,</b><b>id</b><b>zipcode</b><b>this.form.zipcode</b>С другой стороны, модифицированная цепочка областей видимости обработчика событий, определяемого с помощью HTML-атрибута, может стать источником ошибок, потому что свойства всех объектов в цепочке видимости скрывают одноименные свойства глобального объекта. Например, объект
<b>Document</b><b>ореn(),</b><b>ореn()</b><b>Window</b><b>window.ореn(),</b><b>ореn().</b><b>id</b><b>id</b><b>window.location</b><b>location</b><b>Location</b>