内联事件处理程序内部的神秘变量“URL”

时间:2014-01-08 00:29:10

标签: javascript html

在以下代码中,当您点击点击此处时,您会在警告对话框中看到什么?

<script>
URL = 'hello' ;
document.write(URL) ;
</script>
<div onclick="alert(URL)">click here</div>

Fiddle

我很确定答案是“你好”,我甚至不在乎尝试 但我实际看到的是当前页面的网址(在Chrome,Firefox和IE9上测试过)。

为什么在内联事件处理程序中定义了URL变量? 为什么它优先于我自己的变量?
我在哪里可以找到有关此行为的文档?


后续

这是否只发生在内联事件处理程序中? 这样的动机是什么动机?


后续行动

我在旧浏览器上做了更多测试,这种行为似乎是远古时代的痕迹。我在以下浏览器上验证了它:

  • Mozilla 1.0.1
  • Firefox 2.0.0.6
  • IExplorer 6.0
  • Nestscape 8.1.2
  • Opera 9.02

这意味着此URL变量肯定不是实验window.URL函数/构造函数。它是一个字符串,它只存在于内联事件处理程序中。

1 个答案:

答案 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>