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

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.downloadonclick处理程序(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点击时.

  • @Joe:这个问题不是问题.那个`this`指的是应该知道的元素......问题是事件处理程序的*scope*不仅包含全局范围,还包含元素本身作为范围.好像有人做了:`with(theElement){theElement.onclick = function(){...}}`...这是令人困惑的部分. (3认同)
  • @FelixKling:[这是一个参考.](http://docstore.mik.ua/orelly/webprog/jscript/ch19_01.htm#jscript4-CHP-19-SECT-1.6)*"定义为HTML属性的事件处理程序有一个更复杂的作用域链.作用域链的头部是调用对象......然而,事件处理程序的作用域链中的下一个对象不是全局对象;它是触发事件处理程序的对象."* (2认同)
  • @Felix Kling&@Ӫ_._Ӫ:对不起,这似乎更接近:http://www.w3.org/TR/html5/webappapis.html#event-handler-attributes."让Scope成为NewObjectEnvironment(元素的对象,Scope)的结果." 这意味着元素本身会在任何其他范围(例如窗口)之前被推送.这也是有道理的,因为`document.xxx`函数似乎可用而不在处理程序属性中使用`document`(`document`也按照那里的规则被推入作用域链中):http://jsfiddle.net/ pimvdb/X5syU/1 / (2认同)