<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's Document, the global environment)
.
Если у элемента есть владелец формы, пусть Scope
будет результатом NewObjectEnvironment(the element's form owner, Scope)
.
Пусть Scope
будет результатом NewObjectEnvironment(the element's 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)">
регистрирует 3
, 5
, 6
при нажатии.