在以下代码中,当您点击点击此处时,您会在警告对话框中看到什么?
<script>
URL = 'hello' ;
document.write(URL) ;
</script>
<div onclick="alert(URL)">click here</div>
我很确定答案是“你好”,我甚至不在乎尝试 但我实际看到的是当前页面的网址(在Chrome,Firefox和IE9上测试过)。
为什么在内联事件处理程序中定义了URL
变量?
为什么它优先于我自己的变量?
我在哪里可以找到有关此行为的文档?
后续
这是否只发生在内联事件处理程序中? 这样的动机是什么动机?
后续行动
我在旧浏览器上做了更多测试,这种行为似乎是远古时代的痕迹。我在以下浏览器上验证了它:
这意味着此URL变量肯定不是实验window.URL
函数/构造函数。它是一个字符串,它只存在于内联事件处理程序中。
答案 0 :(得分:7)
变量 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>