不能在javascript中使用“下载”作为函数名称

时间:2011-10-21 16:12:10

标签: javascript google-chrome

我对这个小片段有疑问:

<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中的“下载”内容是什么。据我所知,它不是一个保留的关键字,它可能是什么?

2 个答案:

答案 0 :(得分:21)

<a>元素在HTML5中具有download属性,如here所述,默认值为""(空字符串)。

这意味着download === this.download处理程序中的onclickthisonevent属性中的元素),因此该元素的download属性为优于download的{​​{1}}属性。

This fiddle列出了默认情况下存在的所有字符串属性。您可以看到window是一个与download类似的属性,also fails在用作函数时具有完全相同的原因(即尝试引用innerHTML,而是执行window.innerHTML)。

如评论中所述,使用elem.innerHTML()不会混淆哪些属性/属性变量将评估。


这种范围行为实际上似乎不是由于window值,而是由于正在构造的特定“范围链”。

根据the HTML5 specification

  

词汇环境范围

     

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)">35

答案 1 :(得分:0)

某些功能名称只是保留或已经使用过。另一个是“评估”。

我建议在所有函数和变量名称前加上一些内容,以避免出现这种情况。示例:“sto_download”