Ama*_*ati 16 javascript google-chrome
我对这个小片段有一个问题:
<script>
function download() {
alert('Hi');
}
</script>
<a href="#" onClick="javascript:download();">Test</a>
Run Code Online (Sandbox Code Playgroud)
点击Chrome 14.0中的链接后,我会收到一个
Uncaught TypeError: string is not a function
Run Code Online (Sandbox Code Playgroud)
在Firefox和IE中它工作得很好.我通过重命名函数解决了这个问题,但我仍然很好奇Chrome中的"下载"内容是什么.据我所知,它不是一个保留的关键字,它可能是什么?
pim*_*vdb 21
<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;
Run Code Online (Sandbox Code Playgroud)
然后,<a ... onclick="console.log(a, b, c)">
日志3
,5
,6
点击时.