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

What is the difference between window.console.log and console.log

刚面试完。问我的第一个问题是console.log()是什么。我非常自信地回答。同样,

第二个问题,window.console.log()console.log()有什么区别。我无语了。尝试在 Google 和 Stack Overflow 中搜索。我发现 post 对理解它们之间的区别没有太大帮助。

非常感谢任何想法。

在正常的浏览器上下文中,没有区别。 console是一个全局变量,所有的全局变量都是window对象的属性。

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

有一些注意事项,例如在浏览器中不 运行 时,或者如果控制台变量已被重新分配。 解释得很好。

如果您的意思是在默认浏览器 JavaScript 环境中,实际上 none 提供了 windowconsole 避风港没有被跟踪或重新分配。

默认浏览器JavaScript环境下,window是一个global,指的是全局对象,也就是window对象。全局对象将大部分全局变量作为属性保存(过去是全部,但在 ES2015 中发生了变化;由 letconstclass 创建的全局变量不是全局对象的属性) .但在大多数非浏览器环境中(例如,NodeJS 使用 global 而不是 window),甚至在某些非默认浏览器环境中(例如 web worker 的环境,它不没有 window,因为他们无法访问 window)。因此,在未定义 window 的环境中,window.console.log 将失败,而 console.log 则不会(前提是环境提供全局 console)。

为了理解其中的区别,让我们逐一研究:

console.log(...) 表示:

  1. JavaScript 引擎必须搜索标识符 console 的绑定,从当前执行上下文开始,然后是下一个,然后是下一个,直到它在全局范围内找到它.
  2. 然后它在结果对象上查找 log 属性。
  3. 然后调用它

window.console.log(...) 表示:

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

例如,这里有一个示例,其中 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();

console.logwindow.console.log没有区别。 查看 MDN。他们清楚地引用 -

The Console object can be accessed from any global object, Window on browsing scopes, WorkerGlobalScope, and its specific variants in workers via property console. It's exposed as Window.console, and can be referenced as simply console.



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

console.logwindow.console有什么区别。

答案是-

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

window.console 检查控制台是否可用(truthy 值)以便我们接下来可以登录。(如果是移动浏览器,它们不支持 debugger/console)

代码中的常见模式是-

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

这基本上是 -

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