在下面的代码中,当您点击点击此处时,您会在警告对话框中看到什么?
<script>
URL = 'hello' ;
document.write(URL) ;
</script>
<div onclick="alert(URL)">click here</div>
我非常确定答案会是“你好”,所以我什至都不想尝试。
但我实际看到的是当前页面的 url(在 Chrome、Firefox 和 IE9 上测试过)。
为什么这个 URL
变量定义在内联事件处理程序中?
为什么它优先于我自己的变量?
我在哪里可以找到有关此行为的文档?
跟进
这是否意味着只发生在内联事件处理程序中?
这样做的动机是什么?
后续2
我在旧浏览器上做了更多测试,这种行为似乎是远古时代的痕迹。我在以下浏览器上验证了它:
- 摩斯拉 1.0.1
- 火狐 2.0.0.6
- IExplorer 6.0
- 雀巢 8.1.2
- 歌剧 9.02
这意味着这个 URL 变量肯定不是实验性的 window.URL
函数/构造函数。它是一个字符串,仅存在于内联事件处理程序中。
最佳答案
变量window.URL
(即全局变量 URL
)是特殊的。 (将您的脚本更改为使用其他名称,例如 url
,它的行为将如您最初预期的那样。)一些关于 URL
的文档可以查到here .请注意,不支持 URL
的浏览器不会以这种意想不到的方式行事。
嗯,上面说的不太对。有两个URL
变量在这里发挥作用。当脚本运行时,它会覆盖(或创建)window.URL
,然后写入文档。 (请注意,您的代码会删除 window.URL
,因此一旦您的脚本运行,您将无法再在支持该技术的浏览器中执行类似 var n = new URL(...);
的操作。)
另一方面,当 <div>
已创建,onclick
处理程序属性值转换为函数:
function() {
alert(URL);
}
解释行为的重要一点是,从字符串到函数的转换是在 document
的上下文中执行的.因此 URL
在这个函数中指的是document.URL
. (document.URL
属性描述为 here。)您可以通过执行以下操作来验证这一点:
<script>
URL = 'hello' ;
document.write(URL);
</script>
<div onclick="alert(URL === document.URL)">click here</div>
关于javascript - 内联事件处理程序中的神秘变量 "URL",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20984829/