Показать сообщение отдельно
  #9 (permalink)  
Старый 06.10.2009, 00:17
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Zeroglif
неактивные уже отметились типа меня
Да ладно, я сам очень редко создаю темы (наверное, всего третья за всё время) Эта просто поинтересней была.

Сообщение от Kolyaj
Ждем откровений.
Сообщение от Zeroglif
пиши уж )
Ну ладно, раз больше никто не хочет высказать свои предположения...

Большинство (включая меня ) в первую секунду подумали, что вопрос простецкий и связан с IE (тот случай, когда IE маппит id-шники в глобальную область). Но нет, данное поведение воспроизводится во всех браузерах (к тому же, задан атрибут "name", а не "id").

Но в отладчике всё быстро прояснилось.

Дело связано с наличием формы. Функция, создаваемая из кода атрибута "onclick", порождается в контексте, scope chain которого содержит объект input-a и объект-формы. Соответственно, весь этот scope chain запоминается в onclick-функцию свойством [[Scope]]. Далее, при активации функции, создаётся её собственный Scope chain (AO контекста + [[Scope]]), где и происходит разрешение имён идентификаторов.

Если вставить вызов отладчика

<input ... onclick="debugger; alert(test === this);" />


и посмотреть Scope chain контекста, то мы увидим там пять объектов:

0. Call event=Event click
1. input Test
2. form (где |test| - это input-элемент)
3. Document
4. Window (где |test| - это глобальная функция)


Ну, а разрешение имени происходит из самого глубокого звена цепи, и вверх. Соответственно, имя test будет найдено на (3)-ем шаге, в пункте (2), т.е. в объекте формы, и значением будет является input-элемент.

Если удалить форму, то ошибки не будет (т.е. атрибут name может свободно называться, как функция), т.к. в Scope chain-e не будет формы, и имя test будет разрешено в глобальном объекте.

P.S.> Оригинальный вопрос и ответ в c.l.js - http://groups.google.ru/group/comp.l...11199a44?hl=en
__________________
Тонкости ECMAScript
Ответить с цитированием