What is the difference between window.console.log and console.log
只是接受了一次采访。问我的第一个问题是console.log()。我很自信地回答。同样,
第二个问题是,window.console.log()和console.log()有什么区别。我无语了。尝试在Google和Stack Overflow中进行搜索。我没有找到这么有用的文章来了解它们之间的区别。
任何想法都会受到赞赏。
- developer.mozilla.org/zh-CN/docs/Web/API/控制台
-
在浏览器页面中,它们通常是相同的,因为window是全局名称空间。不一定在其他情况下。
-
听起来不错。因此,按功能和输出,根本没有区别吗?面试官有没有试图欺骗我?
-
不是心智读者,很难知道面试官在做什么,但是我的猜测是,问题是要测试您是否意识到window是全局对象(至少在某些环境中)。
-
在浏览器中引用内置的全局属性X时,是否应该复制一个window.X?
-
另请参见为什么使用window.variable访问变量的速度较慢?
-
在(桌面)浏览器中引用内置的全局属性X时,是否应复制一个write window.X?
在常规浏览器上下文中,没有区别。 console是全局变量,所有全局变量都是window对象的属性。
1
| console.log(console.log==window.console.log) // true |
有一些警告,例如在浏览器中未运行时,或者是否已重新分配了控制台变量。 T.J. Crowder很好地解释了这一点。
- 有区别,通常只是不重要。
-
在工作线程和其他window不是全局对象的上下文中,它不会是true。
-
(从ES2015开始,并不是所有的全局变量都是全局对象的属性。)
-
@TedHopp"在浏览器中",并且工作程序不在正常的浏览器上下文中运行。
-
@Scimonster:网络工作者绝对在"浏览器中"。 (是的,这是与默认环境不同的环境。)
-
OP面临的问题似乎并未指定它在"浏览器中",因此您的答案似乎不完整。
-
@TedHopp::-)哦,我不会为此给Sci带来麻烦,我敢打赌,这就是OP的意思。
-
简短而甜美的答案,举一个很好的例子。谢谢
如果您的意思是在默认的浏览器JavaScript环境中,则实际上没有提供任何内容,而window和console尚未被遮盖或重新分配。
在默认的浏览器JavaScript环境中,window是一个全局变量,它引用全局对象,该对象也是窗口对象。全局对象将大多数全局变量保存为属性(以前是全部,但在ES2015中已更改;由let,const或class创建的全局变量不是全局对象的属性)。但这在大多数非浏览器环境(例如,NodeJS使用global而不是window),甚至在某些非默认浏览器环境(例如网络工作者的环境)中,都不是这样。其中没有window,因为他们无法访问该窗口)。因此,在未定义window的环境中,window.console.log将在console.log不会的环境中失败(前提是该环境提供了全局console)。
要了解它们之间的区别,让我们通过以下方法进行研究:
console.log(...)表示:
JavaScript引擎必须从当前执行上下文开始搜索标识符console的绑定,然后是下一个,然后是下一个,直到在全局范围内找到它为止。
然后,它在结果对象上查找log属性。
然后它称之为
window.console.log(...)表示:
JavaScript引擎必须从当前执行上下文开始搜索标识符window的绑定,然后是下一个,然后是下一个,直到在全局范围内找到它为止。
然后,它在结果对象上查找console属性。
然后,它在结果对象上查找log属性。
然后它称之为
例如,这是一个示例,其中console已被遮盖,因此console.log失败而window.console.log起作用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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(); |
-
还提供了您正在非给定的浏览器页面中运行的情况。
-
@pvg:相当,我只是重新阅读了问题,实际上并没有这么说。 :-)
-
@Santosh:我不知道您所说的"优先"是什么意思。
-
@Santosh-window.console.log()限制您的代码在以window为全局对象(或全局对象的属性)的环境中工作。我将使用console.log()(不带window.前缀),因为这将在全局对象中定义了console的任何位置(无论其命名如何)都可以使用。
-
@pvg:多亏了您和Ted,我现在已经解决了非浏览器和Web工作者方面的问题,我已经完全掩盖了... :-)
-
@ T.J。Crowder是的。我认为这是故意的(不是作者所为),以便很好地属于"糟糕的面试问题"类别。
-
@pvg:无论是否有意,它都属于该类别。 ;-)
-
@pvg,我不同意这本质上是一个糟糕的面试问题。这实际上取决于面试的目的。这样的问题可以快速确定对JavaScript内部有更深了解的人员,和/或熟悉window只是另一个变量的环境编写JavaScript的人员。有相当数量的此类环境。如果所有人要做的就是为网页编写原始的JavaScript代码,那么是的,这不是一个好问题。另一方面,工作可能是在这种理解很重要的地方编写代码。
-
@Makyen,这是一个合理的面试讨论话题。作为一个单一的"陷阱"问题,这是垃圾。
-
@pvg,"单发,'陷阱'问题"几乎总是天生就是垃圾,只是出于它们是此类问题的意图。在这种情况下,我们可能不知道是否这样,因为OP没有为我们提供足够的有关工作和面试的背景信息,以便我们做出决定。
-
@pvg,关于这个特定主题,我已经回答了许多关于SO的问题,其中主要的问题,或者至少是次要的问题是,OP无法理解window仅仅是其作用域/上下文中的另一个变量。他们正在编写代码。如果这项工作是专门为在这种环境下编写代码而设计的,那么我当然可以在面试中看到自己问类似的问题。正如您提到的那样,这将是讨论的一部分,而不是"陷阱",而可能是衡量受访者对环境的理解程度的一部分。
console.log和window.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.log和window.console之间的区别是什么。
答案是-
console.log用于记录日志(如您所知)。
window.console检查控制台是否可用(truthy值),以便我们下次登录。(对于移动浏览器,它们不支持调试器/控制台)
此代码中的通用模式是-
window.console && console.log(open_date);
基本上是-
的短代码
1 2 3
| if( window.console ) {
console.log( open_date );
} |