Javascript Firefox中的open()和window.open()有什么区别?
在回答调用Javascript Firefox中的open()和window.open()有什么区别?,javascript,firefox,window,Javascript,Firefox,Window,在回答调用open()和window.open()之间的区别时,请在Firefox中尝试以下示例(在11.0上测试): (调用打开;在FF的新选项卡中打开,前提是“改为在新选项卡中打开新窗口”设置处于启用状态,默认设置为启用状态) (调用窗口。打开;在新的小窗口中打开) 但究竟为什么会有区别呢?如果我尝试以下方法: var a=2; 函数hello(){alert(this.a);} 你好; window.hello(); 调用函数的两个变体hello的工作方式完全相同,包括使用相同的thi
open()
和window.open()
之间的区别时,请在Firefox中尝试以下示例(在11.0上测试):
打开
;在FF的新选项卡中打开,前提是“改为在新选项卡中打开新窗口”设置处于启用状态,默认设置为启用状态)窗口。打开
;在新的小窗口中打开)
var a=2;
函数hello(){alert(this.a);}
你好;
window.hello();
调用函数的两个变体
hello
的工作方式完全相同,包括使用相同的this
事实上,它们是相同的。尝试window.open===open
或window[“open”]==open
。
如果这对您来说是false,那么您必须处于一个闭包中,并且somecode已经定义了open
当然,这代表所有作为全局(窗口)对象成员的对象。您的两个小提琴在Chrome上对我的作用相同 但是,这两行代码
window.open(…)代码>
及
open(…)代码>
它们并不等同。它们唯一等效的时间是,如果当前执行范围没有为open
提供新定义,则会导致解释器在更高的范围中查找,直到它到达全局范围并找到窗口。open
您可以在以下内容中看到这一点:
在浏览器中,默认上下文为窗口
。这就是为什么你可以调用open()
,alert()
甚至escape()
。调用window.open()
完全等同于open()
如何通过open()
函数调用打开新窗口完全取决于您的浏览器。这确实很奇怪。当作为属性添加时,onclick
处理程序似乎具有与窗口不同的包装的open
函数的上下文。open
:
这在最新的Firefox、Safari和Chrome中都会发生。我找不到任何浏览器的解释或错误报告
我试图找出Firefox的源代码中发生了什么,但老实说,这对我来说太过分了。看起来有名为nsGlobalWindow::Open
和nsGlobalWindow::OpenJS
,但我不确定这是否与问题有关。在事件处理程序中,Open
本身将解析为document.Open
。正如Boris Zbarsky在评论和中提到的,这是HTML5指定的预期行为。在中,步骤6指定:
六,。使用上面创建的脚本执行环境,创建
函数对象(定义见ECMAScript第5版第13.2节
创建函数对象),包括:
(…)
词汇环境范围
让作用域成为NewObjectEnvironment(元素的文档,全局环境)的结果李>
如果元素有表单所有者,则让作用域成为NewObjectEnvironment的结果(元素的表单所有者,作用域)李>
让作用域成为NewObjectEnvironment(元素的对象,作用域)的结果。
(……)
换句话说,事件处理程序中的变量引用将按以下顺序解析:
局部范围
元素属性
业主表格属性(如适用)
文档
属性
全球范围
您的一个小提琴正在调用window.open
,而另一个小提琴正在调用document.open
,因为内联属性事件处理程序中的作用域链很奇怪。所以你最终在
这就是说,由于您传递了3个参数,因此应该调用window.open
。行为上的差异似乎是Firefox中的一个bug。我对此进行了归档。对我来说效果相同,所有样本都打开了相同的东西。事实上,它们是一样的,除非你定义了另一个函数调用open。两个JS提琴对我来说也表现出相同的行为(打开一个新窗口)。这里也一样,我尝试了Opera和Firefox。我的Firefox(3.6.21)的行为与预期的一样(window.open
与open
)并且这两个提琴都打开了一个新窗口。然而,我想可能是后来的版本为了迎合标签的需要,对定义做了微妙的修改。对不起!我想说的是Firefox有一个区别,但不小心删除了它,它只是在关键字上。再加一次!firefox中的差异在中有更多的描述。是的,这是显而易见的,但是如果你看看我问题中的两个提琴,它们在全局上下文中都调用open
,仍然存在差异@Tomas我认为您需要指定您正在使用的Firefox版本。到目前为止还没有人复制这种现象。@AndrewLeach,当然是最新的一个。。。(这是默认值:-))。但是你如何解释这两把小提琴的区别呢?没有区别。当新窗口设置为在浏览器中作为选项卡打开时,它们将作为选项卡打开。有了这一点,它们就像窗户一样打开。您必须指定您看到不同的浏览器和版本,以及新的窗口策略。确保您没有运行任何可能影响新windows/选项卡式浏览的特殊插件。Pumba。。。我没有任何特殊的标签插件,只有带Firebug的FF 11.0、Web开发者工具栏和RealPlayer浏览器记录附加组件。请看我在问题中更新的设置说明。不知道该告诉你什么-这里的每个人都在说同样的话;他们无法重现你的经历。除了让人查看Firefox中about:config的完整输出外,我相信它要么是一个你不知道的插件,要么是一个令人困惑的设置
<script>
var a = 2;
function hello() { alert(this.a); }
hello();
window.hello();
</script>
var test = function () {
var open = function () {
alert('uh oh');
};
window.open('www.google.com');
open('www.google.com');
};
test();