Ответ 1
Элементы <a>
имеют атрибут download
в HTML5, как описано здесь, со значением по умолчанию ""
(пустая строка).
Это означает, что download === this.download
в обработчике onclick
(this
- это атрибут onevent
), поэтому атрибут download
элемента превосходит свойство download
window
.
Эта скрипта содержит список всех атрибутов строки, которые присутствуют по умолчанию. Вы можете видеть, что download
- это атрибут точно так же, как innerHTML
, который также терпит неудачу с той же самой причиной, когда используется как функция (т.е. пытается для ссылки на window.innerHTML
, но вместо этого выполняем elem.innerHTML()
).
Как сказано в комментариях, использование window
не приводит к путанице в отношении того, какие переменные свойств/атрибутов будут оцениваться.
Поведение этой области действительно не похоже на значение this
, а скорее на определенную "цепочку областей видимости", которая создается.
Как спецификация HTML5:
Лексическая область окружения
Пусть
Scope
является результатомNewObjectEnvironment(the element Document, the global environment)
.Если элемент имеет владельца формы, пусть
Scope
является результатомNewObjectEnvironment(the element form owner, Scope)
.Пусть
Scope
является результатомNewObjectEnvironment(the element object, Scope)
.
т.е. то, что происходит, - это целая область действия window
→ document
→ element
(увеличение превосходства). Это означает, что download
оценивается как element.download
, а не window.download
. Из этого также можно заключить, что getElementById
будет пузыриться до document.getElementById
(данный elem.getElementById
не существует).
Я установил систематический пример, чтобы вы могли видеть, как переменные пузыряют цепочку областей видимости:
window.a = 1;
document.a = 2;
elem.a = 3;
window.b = 4;
document.b = 5;
window.c = 6;
Затем <a ... onclick="console.log(a, b, c)">
logs 3
, 5
, 6
при нажатии.