Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中不能使用“下载”作为函数名_Javascript_Google Chrome - Fatal编程技术网

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

在javascript中不能使用“下载”作为函数名,javascript,google-chrome,Javascript,Google Chrome,我对这个小片段有一个问题: <script> function download() { alert('Hi'); } </script> <a href="#" onClick="javascript:download();">Test</a> 在Firefox和IE中,它工作得很好。我通过重命名函数解决了这个问题,但我仍然很好奇Chrome中的下载是怎么回事。据我所知,它不是一个保留关键字,那么它可能是什么?有些函数名只是保留的或已经

我对这个小片段有一个问题:

<script>
function download() {
    alert('Hi');
}
</script>
<a href="#" onClick="javascript:download();">Test</a>

在Firefox和IE中,它工作得很好。我通过重命名函数解决了这个问题,但我仍然很好奇Chrome中的下载是怎么回事。据我所知,它不是一个保留关键字,那么它可能是什么?

有些函数名只是保留的或已经使用过。另一个是评估

我建议在所有函数和变量名前加上一些前缀,以避免出现这种情况。示例:STOU下载,默认值为空字符串

这意味着onclick处理程序中的download===This.download这是onevent属性中的元素,因此该元素的download属性优于window的download属性

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

正如在注释中所说,使用窗口不会混淆属性/属性变量的计算结果

这种作用域行为实际上似乎并不是由于该值,而是由于正在构造的特定作用域链

根据:

词汇环境范围

让作用域成为NewObjectEnvironment元素的文档,即全局环境的结果

如果元素有表单所有者,则将作用域设为NewObjectEnvironment元素的表单所有者Scope的结果

让Scope作为newObjectEnvironment元素的对象Scope的结果

也就是说,范围链是窗口->文档->元素增加优势。这意味着下载的计算结果为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;

然后,单击时记录3、5、6。

是否安装了任何扩展?已确认。甚至删除javascript:这不应该存在,也没有帮助。奇怪的不要使用全局函数。将函数放在命名空间中,并以编程方式绑定事件处理程序。@Muu,我有很多,但即使我启动一个显然禁用扩展的匿名窗口,我仍然会收到错误。另外,正如Tomalak在下面指出的,console.logdownload提供了未定义的命令。@Amati:您在哪里执行此操作?如果您创建了一个JSFIDLE,请注意,实际代码是在iframe中运行的,全局变量无法从控制台访问。如果我从脚本中删除函数定义,并且没有定义console.logdownload或console.logdownload,那么我得到的下载就没有定义。这并不能真正解释Chrome中的情况,是吗?我不喜欢这个奇怪的范围聚合,或者你想叫它什么的。。。表单也是如此+1所以这是否意味着可以通过将其更改为onClick=window.download来修复?@Joe:这不是问题所在。这是指应该知道的元素。。。问题在于,事件处理程序的作用域不仅包含全局作用域,还包含元素本身作为作用域。这就好像有人做了:WitheElement{theElement.onclick=函数{…}。。。这是令人困惑的地方。@FelixKling:定义为HTML属性的事件处理程序有一个更复杂的作用域链。作用域链的头部是调用对象。。。但是,事件处理程序范围链中的下一个对象不是全局对象;正是该对象触发了事件处理程序。@Felix Kling&@ӪӪ:抱歉,这似乎更接近:。让Scope作为newObjectEnvironment元素的对象Scope的结果。这意味着元素本身被推到任何其他作用域之前,例如窗口。这也是有意义的,因为document.xxx函数似乎不需要在处理程序属性中使用document,而且document也会按照其中的规则被推送到范围链中:
window.a   = 1;
document.a = 2;
elem.a     = 3;

window.b   = 4;
document.b = 5;

window.c   = 6;