Firefox中的open()和window.open()有什么区别?

TMS*_*TMS 6 javascript firefox window

在回答我的问题Pumbaa80发现调用之间的差异open(),并window.open()尝试下面的例子在Firefox(上11.0测试):

  1. http://jsfiddle.net/9kqp5/(调用open; 在FF中的新选项卡中打开,前提是"在新选项卡中打开新窗口"设置已打开,默认情况下是这样)

  2. http://jsfiddle.net/HLbLu/(电话window.open; 在新的小窗口打开)

但为什么到底有区别呢?如果我尝试以下示例:

<script>
var a = 2;
function hello() { alert(this.a); }

hello();
window.hello();
</script>
Run Code Online (Sandbox Code Playgroud)

调用函数的两种变体hello完全相同,包括具有相同的this!!!

Bor*_*sky 8

你的一个小提琴是window.open在另一个调用时调用document.open,因为内联属性事件处理程序中的作用域链很奇怪.所以你最终访问http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#dom-document-open

也就是说,因为你传递了3个参数,所以这应该是调用的window.open.行为上的差异似乎是Firefox中的一个错误.我提交了https://bugzilla.mozilla.org/show_bug.cgi?id=741266.


Che*_*vel 6

在事件处理程序内部,open它本身将解析为document.open.正如Boris Zbarsky在评论和他的回答中所提到的,这是HTML5指定的预期行为.在有关事件处理程序的部分中,步骤6指定:

6.使用上面创建的脚本执行环境,创建一个函数对象(如ECMAScript第5版第13.2节"创建函数对象"中所定义),具有:

(...)
词汇环境范围

  1. 让Scope成为NewObjectEnvironment(元素的Document,全局环境)的结果.
  2. 如果元素具有表单所有者,则让Scope为NewObjectEnvironment(元素的表单所有者,Scope)的结果.
  3. 让Scope成为NewObjectEnvironment(元素的对象,Scope)的结果.
    (......)

换句话说,事件处理程序中的变量引用将按顺序解析:

  1. 当地范围
  2. 元素属性
  3. 所有者表格属性(如果适用)
  4. document 性能
  5. 全球范围