<a>
元件具有一个download
作为解释HTML5属性这里,用默认值""
(空字符串)。
这意味着download === this.download
在onclick
处理程序中(this
是属性中的元素onevent
),因此download
元素的属性优于 的download
属性window
。
这个小提琴列出了默认情况下存在的所有字符串属性。您可以看到download
一个类似于 的属性innerHTML
,当用作函数时,它也以完全相同的原因失败(即尝试引用window.innerHTML
,而是执行elem.innerHTML()
)。
正如评论中所说, usingwindow
不会混淆属性/属性变量将评估为什么。
这种作用域行为实际上似乎不是由于this
值,而是由于正在构建的特定“作用域链”。
根据HTML5 规范:
词法环境范围
让Scope
成为 的结果NewObjectEnvironment(the element's Document, the global environment)
。
如果该元素有一个表单所有者,那么 letScope
是 的结果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
点击时。