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

San*_*osh 32 javascript console.log

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

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

任何想法都非常感谢.

Sci*_*ter 38

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

console.log(console.log==window.console.log) // true
Run Code Online (Sandbox Code Playgroud)

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


T.J*_*der 35

如果您的意思是在默认的浏览器JavaScript环境中,实际上没有提供 window,console也没有被镜像或重新分配.

在默认浏览器JavaScript环境中,window是一个引用全局对象的全局对象,它也是窗口对象.全局对象保持最全局作为属性(它使用的是所有的,但在ES2015,改变;可以通过创建全局let,constclass不是全局对象的属性).但是在大多数非浏览器环境中都不是这样(例如,NodeJS,global而不是使用window),甚至在某些非默认的浏览器环境中(例如Web工作者的环境,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();
Run Code Online (Sandbox Code Playgroud)

  • @Santosh - `window.console.log()`限制你的代码在`window`是全局对象(或全局对象的属性)的环境中工作.我使用`console.log()`(没有`window.前缀)因为它可以在全局对象中定义`console`的任何地方工作,无论它是什么名字. (2认同)
  • @pvg,我不同意这本质上是一个糟糕的面试问题.这真的取决于面试的内容.这样的问题可以快速识别对JavaScript内部有更深入理解的人,和/或熟悉为`window`只是另一个变量的环境编写JavaScript的人.有合理数量的此类环境.如果所有人都要做的就是为网页编写普通的JavaScript代码,那么,是的,这不是一个好问题.另一方面,工作可能是编写理解*重要*的代码. (2认同)
  • @pvg,关于这个特定的主题,我回答了很多关于SO的问题,其中主要或至少是次要的问题是OP不理解`window`只是范围/上下文中的另一个变量他们在写代码.*如果这份工作是专门为这样的环境编写代码*,我当然可以看到自己在面试中询问类似的东西.正如你所提到的,它将作为讨论的一部分,而不是作为"陷阱",但可以成为衡量受访者对他们对环境的理解的一部分. (2认同)