javascript - 内联事件处理程序中的神秘变量 "URL"

标签 javascript html

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

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

Fiddle

我非常确定答案会是“你好”,所以我什至都不想尝试。
但我实际看到的是当前页面的 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/

相关文章:

html - 如何将图像放在垂直条上方?

html - IE10 中的背景图像失真并随内容流移动背景?

html - 如何使用 CSS 设置标题的父 li 元素的样式?

javascript - 上传 Base64 图片 Facebook Graph API

javascript - 使用 controllerAs 语法通过指令 $watch 更改父 Controller 模型

javascript - 无法将数据从 Controller 读取到 View 中

javascript - Vuex:直接访问商店还是传递属性?

Javascript:比较表中的值

javascript - 缩放图像和 HTML5 视频以适合具有相同高度的行

Javascript 限制将图像显示为 1 个显示器