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

时间:2013-01-14 19:09:56

标签: javascript google-chrome

如果您在Chrome中查看this fiddle并点击js控制台打开的触发器文字,您会看到:

enter image description here

所有with块的原因是什么?它的价值是什么?

2 个答案:

答案 0 :(得分:6)

在我看来,当它被指定为HTML“onclick”属性时,浏览器如何为事件处理程序创建函数。我认为它的作用是什么:

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

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

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

$('<a href=# onclick="console.log(baseURI);"> ...

然后你得到<a>元素的“baseURI”属性的值。不需要为明确引用<a>元素的DOM节点的任何内容添加前缀“baseURI”;它只是“存在”,好像它是在某个封闭范围内用var声明的。

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

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

答案 1 :(得分:1)

with将它的参数移到范围堆栈的顶部。所以它甚至比全局对象,函数参数等更高。不知道为什么他们使用它。也许这是一个生成的代码。