我对这个小片段有疑问:
<script>
function download() {
alert('Hi');
}
</script>
<a href="#" onClick="javascript:download();">Test</a>
点击Chrome 14.0中的链接后,我得到了
Uncaught TypeError: string is not a function
在Firefox和IE中它运行得很好。我通过重命名函数解决了这个问题,但我仍然很好奇Chrome中的“下载”内容是什么。据我所知,它不是一个保留的关键字,它可能是什么?
答案 0 :(得分:21)
<a>
元素在HTML5中具有download
属性,如here所述,默认值为""
(空字符串)。
这意味着download === this.download
处理程序中的onclick
(this
是onevent
属性中的元素),因此该元素的download
属性为优于download
的{{1}}属性。
This fiddle列出了默认情况下存在的所有字符串属性。您可以看到window
是一个与download
类似的属性,also fails在用作函数时具有完全相同的原因(即尝试引用innerHTML
,而是执行window.innerHTML
)。
如评论中所述,使用elem.innerHTML()
不会混淆哪些属性/属性变量将评估。
这种范围行为实际上似乎不是由于window
值,而是由于正在构造的特定“范围链”。
词汇环境范围
让
this
成为Scope
的结果。如果元素包含表单所有者,请
NewObjectEnvironment(the element's Document, the global environment)
为Scope
的结果。让
NewObjectEnvironment(the element's form owner, Scope)
成为Scope
的结果。
即。正在发生的事情是范围链是NewObjectEnvironment(the element's object, Scope)
- &gt; window
- &gt; document
(越来越优越)。这意味着element
评估为download
而不是element.download
。从中可以得出结论,window.download
将冒出getElementById
(给定document.getElementById
不存在)。
我设置a systematic example,以便您可以看到变量如何在范围链中冒出来:
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
。
答案 1 :(得分:0)
某些功能名称只是保留或已经使用过。另一个是“评估”。
我建议在所有函数和变量名称前加上一些内容,以避免出现这种情况。示例:“sto_download”