<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点击时。