Сообщение от 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