为什么Chrome使用`with`进行内联事件

Mos*_*heK 6 javascript google-chrome

如果你看一下Chrome 中的这个小提琴并点击js控制台打开的Trigger文本,你会看到:

在此输入图像描述

所有这些with街区的原因是什么?它的价值是什么?

Poi*_*nty 6

在我看来它是指定为HTML"onclick"属性时,浏览器如何为事件处理程序创建函数.我认为它的作用是:

  • 使用事件对象和提供的代码的单个参数创建事件处理函数;
  • 使元素(<a>标记)的属性,空对象(?)和文档对象看起来是该函数中代码的可用符号.

也就是说,this[0]<a>元素本身,this[1]看起来像一个空的对象实例,this[2]是文档对象.这意味着在代码中你编写"onfoo"事件处理程序属性的一部分(而不是从直接JavaScript代码绑定的任何普通事件处理程序中的代码),可以引用目标元素的属性(元素为您正在设置属性)和文档元素的属性,就好像它们存在于作用域链中一样.

如果您稍微更改一下代码:

$('<a href=# onclick="console.log(baseURI);"> ...
Run Code Online (Sandbox Code Playgroud)

然后你得到<a>元素的"baseURI"属性的值.无需为显式引用该<a>元素的DOM节点的任何内容添加"baseURI"前缀; 它只是"存在",好像它是var在一些封闭范围内声明的那样.

(现在查看w3c规范......)编辑 - 我还没有找到任何规定事件处理程序中脚本代码可用的符号的内容.这真的很奇怪.

再次编辑 - Firefox似乎做了同样的事情,虽然我没有在with任何地方看到明确的陈述.

  • @ScottSauyet我不知道'with`语句的确切来源.令我害怕的部分是`with`语句的**效果**,这也是Firefox的行为. (2认同)