Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firefox中的open()和window.open()有什么区别?_Javascript_Firefox_Window - Fatal编程技术网

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();