window.console.log和console.log之间有什么区别

时间:2017-01-03 18:27:45

标签: javascript console.log

刚接受采访。问我的第一个问题是console.log()。我非常自信地回答。再次,

第二个问题是,window.console.log()console.log()之间有什么区别。我无言以对。尝试在Google和Stack Overflow中搜索。我没有找到这样有用的帖子来理解它们之间的区别。

非常感谢任何想法。

3 个答案:

答案 0 :(得分:38)

在普通的浏览器环境中,没有区别。 console是一个全局变量,所有全局变量都是window对象的属性。

console.log(console.log==window.console.log) // true

有一些注意事项,例如未在浏览器中运行,或者是否已重新分配控制台变量。 T.J. Crowder很好地解释了。

答案 1 :(得分:34)

如果您的意思是在默认的浏览器JavaScript环境中,实际上没有提供 windowconsole未被遮蔽或重新分配。

在默认浏览器JavaScript环境中,window是一个全局对象,它引用全局对象,也是窗口对象。全局对象将大多数全局变量保存为属性(以前它是全部,但在ES2015中已更改;由letconstclass创建的全局变量不是全局对象的属性) 。但是在大多数非浏览器环境中都不是这样(例如,NodeJS使用global而不是window),甚至在某些非默认浏览器环境中(例如网络工作者的环境,没有window,因为他们无法访问窗口)。因此,在未定义window的环境中,window.console.log将失败,而console.log则不会(假设环境提供全局console)。

要理解这些差异,让我们通过以下方式开展工作:

console.log(...)表示:

  1. JavaScript引擎必须从当前执行上下文开始搜索标识符console的绑定,然后搜索下一个绑定,然后搜索下一个,直到它在全局范围内找到它。
  2. 然后它会在结果对象上查找log属性。
  3. 然后它称之为
  4. window.console.log(...)表示:

    1. JavaScript引擎必须从当前执行上下文开始搜索标识符window的绑定,然后搜索下一个绑定,然后搜索下一个,直到它在全局范围内找到它。
    2. 然后它会在结果对象上查找console属性。
    3. 然后它会在结果对象上查找log属性。
    4. 然后它称之为
    5. 例如,以下是console被遮蔽的示例,因此console.log失败而window.console.log无效:

      function foo() {
        var console = 42;
        
        try {
          console.log("You WON'T see this.");
        } catch (e) {
        }
      
        try {
          window.console.log("You WILL see this.");
        } catch (e) {
        }
      }
      foo();

答案 2 :(得分:1)

console.logwindow.console.log之间没有区别。 检查MDN。他们明确引用 -

  

可以从任何全局对象Window on访问Console对象   浏览范围,WorkerGlobalScope及其特定的变体   工人通过物业控制台。它被公开为Window.console,和   可以简单地引用console


除此之外,问题可能也是 -

console.logwindow.console之间的区别是什么。

答案是 -

console.log用于记录(如您所知)。

window.console检查控制台是否可用(truthy值),以便我们可以在下一步登录。(对于移动浏览器,他们不支持调试器/控制台)

代码中的常见模式是 -

window.console && console.log(open_date);

这基本上是 -

的简短代码
if( window.console ) {
    console.log( open_date );
}