0

我正在尝试理解教程中的一些代码,并且有一行:

window.console && window.console.timeEnd && console.timeEnd('Generated In');

这将在 JavaScript/jQuery 中做什么?

4

8 回答 8

3

这里有趣的是&&操作符。它说“如果左手为假,则返回该值;如果为真,则执行右手并返回该值”。关键是,如果左边是假的,右边就不会被执行。这称为短路,可用于简写条件。

在这种情况下,您的代码:

window.console && window.console.timeEnd && console.timeEnd('Generated In');

相当于:

if (window.console) {
    if (window.console.timeEnd) {
        console.timeEnd('Generated In');
    }
}

因此,在您尝试调用函数并可能window.console获取.window.console.timeEndReferenceError

于 2013-08-01T21:36:08.633 回答
0

window.console 由各种浏览器实现。我认为你不能指望它存在,这就是为什么这个表达式在调用它的方法之前检查它的存在。

查看 chrome 的文档以了解一种实现的所有细节: https ://developers.google.com/chrome-developer-tools/docs/console

于 2013-08-01T21:34:45.877 回答
0

如果之前启动了此类计时器,它将停止计时器。window.console && window.console.timeEnd 检查以确保 window.console 和 window.console.timeEnd 对象存在,因为并非所有浏览器都支持它。

您可以在此处阅读有关计时器的更多信息https://developer.mozilla.org/en-US/docs/Web/API/console.time?redirectlocale=en-US&redirectslug=DOM%2Fconsole.time ,如您所见 window.console .timeEnd 在 IE 中不受支持,这就是这些检查到位的原因。

于 2013-08-01T21:35:29.427 回答
0

这就是正在发生的事情......基本上。如果 window.console 存在,并且 window.console.timeEnd 存在,则运行 console.timeEnd('GeneratedIn');

你所看到的 && 是我只在 javascript 中看到的一种方式,即只有在它的附加条件存在时才调用函数。因此,如果 window.console.timeEnd 不存在,则语句会在此处结束,而不是继续执行会出错的函数。

这是一个非常相似的问题:如果不在控制语句中,&& 如何在 JavaScript 中工作?

于 2013-08-01T21:35:39.880 回答
0

它结束名为“Generated In”的计时器。window.console检查控制台是否存在,window.console.timeEnd检查 timeEnd 函数是否存在,最后的语句是该函数的执行。

&&运算符只是确保前面的语句已评估为true。一旦其中一个不为真,JavaScript 就会停止评估,因为在那种情况下,整个事情就不能再变为真了。

于 2013-08-01T21:36:14.837 回答
0

window.console对象提供日志记录和调试功能。如果您打开控制台窗口(Ctrl-Shift-J 或 Command-Option-J),您将看到控制台输出。

timeEnd方法提供计时功能。有关详细信息,请参阅MDN 文档

这个特殊的构造在调用它之前检查console对象和方法的存在。timeEndJavaScript 有短路求值,所以 ifwindow.console是假的,window.console.timeEnd永远不会被求值(如果是,它会失败),如果window.console.timeEnd是假的,console.timeEnd('Generated In')永远不会被调用(如果是,它会失败)。换句话说,这是出于调试目的而启动计时器的一种超级安全的方式。

采用这种方法的一个原因是旧版本的 IE 不定义控制台对象,除非您正在调试。这将在您的脚本中创建不可见的运行时错误,这很糟糕。

解决此问题的另一种方法(我更喜欢的方法)是存根您打算使用的对象和函数。您在问题中询问的方法的问题是,每次您调用console.log()或任何控制台计时器功能时,您都必须做同样的事情。啰嗦,效率低下!不干燥!使用存根,您只需执行一次,然后您就可以使用对象和方法,而不必担心它们不存在。例如:

// stub the console object & desired functions if necessary
window.console || window.console = {};
window.console.log || window.console.log = function(){};
window.console.time || window.console.time = function(){};
window.console.timeEnd || window.console.timeEnd = function(){};

// now we can use our functions without worrying about them not
// being implemented
console.log( 'hello!' );
console.time( 'myTimer' );
console.log( 'hello again!' );
console.timeEnd( 'myTimer' );
于 2013-08-01T21:37:28.263 回答
0

console是一个console.timeEnd()调试对象,用于 日志

上面的代码正在测试是否有console成员;如果是这样,它有一个timeEnd()方法吗?如果是这样,请调用它。

它大致相当于:

if (window.console)
  if (window.console.timeEnd)
    window.console.timeEnd('Generated In');
于 2013-08-01T21:37:41.177 回答
0

前两个表达式正在检查以确保 A. 控制台对象存在并且 B. 它具有可以调用的方法。第三个表达式只是调用方法并传入一个字符串,以便用户可以在控制台中查看此输出并查看简单的计时结果。

代码看起来确实很奇怪,但是当您意识到它只是一种用于防止 JavaScript 异常发生的技术时。并非所有浏览器都可以使用控制台对象,因此在这些情况下,代码将什么也不做。

这是一种防御性编码风格,如果由于控制台对象不可用而无法运行,也可以。

于 2013-08-01T21:37:43.940 回答