我正在尝试理解教程中的一些代码,并且有一行:
window.console && window.console.timeEnd && console.timeEnd('Generated In');
这将在 JavaScript/jQuery 中做什么?
我正在尝试理解教程中的一些代码,并且有一行:
window.console && window.console.timeEnd && console.timeEnd('Generated In');
这将在 JavaScript/jQuery 中做什么?
这里有趣的是&&
操作符。它说“如果左手为假,则返回该值;如果为真,则执行右手并返回该值”。关键是,如果左边是假的,右边就不会被执行。这称为短路,可用于简写条件。
在这种情况下,您的代码:
window.console && window.console.timeEnd && console.timeEnd('Generated In');
相当于:
if (window.console) {
if (window.console.timeEnd) {
console.timeEnd('Generated In');
}
}
因此,在您尝试调用函数并可能window.console
获取.window.console.timeEnd
ReferenceError
window.console 由各种浏览器实现。我认为你不能指望它存在,这就是为什么这个表达式在调用它的方法之前检查它的存在。
查看 chrome 的文档以了解一种实现的所有细节: https ://developers.google.com/chrome-developer-tools/docs/console
如果之前启动了此类计时器,它将停止计时器。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 中不受支持,这就是这些检查到位的原因。
这就是正在发生的事情......基本上。如果 window.console 存在,并且 window.console.timeEnd 存在,则运行 console.timeEnd('GeneratedIn');
你所看到的 && 是我只在 javascript 中看到的一种方式,即只有在它的附加条件存在时才调用函数。因此,如果 window.console.timeEnd 不存在,则语句会在此处结束,而不是继续执行会出错的函数。
这是一个非常相似的问题:如果不在控制语句中,&& 如何在 JavaScript 中工作?
它结束名为“Generated In”的计时器。window.console
检查控制台是否存在,window.console.timeEnd
检查 timeEnd 函数是否存在,最后的语句是该函数的执行。
&&
运算符只是确保前面的语句已评估为true
。一旦其中一个不为真,JavaScript 就会停止评估,因为在那种情况下,整个事情就不能再变为真了。
该window.console
对象提供日志记录和调试功能。如果您打开控制台窗口(Ctrl-Shift-J 或 Command-Option-J),您将看到控制台输出。
该timeEnd
方法提供计时功能。有关详细信息,请参阅MDN 文档。
这个特殊的构造在调用它之前检查console
对象和方法的存在。timeEnd
JavaScript 有短路求值,所以 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' );
console
是一个console.timeEnd()
调试对象,用于 日志等
上面的代码正在测试是否有console
成员;如果是这样,它有一个timeEnd()
方法吗?如果是这样,请调用它。
它大致相当于:
if (window.console)
if (window.console.timeEnd)
window.console.timeEnd('Generated In');
前两个表达式正在检查以确保 A. 控制台对象存在并且 B. 它具有可以调用的方法。第三个表达式只是调用方法并传入一个字符串,以便用户可以在控制台中查看此输出并查看简单的计时结果。
代码看起来确实很奇怪,但是当您意识到它只是一种用于防止 JavaScript 异常发生的技术时。并非所有浏览器都可以使用控制台对象,因此在这些情况下,代码将什么也不做。
这是一种防御性编码风格,如果由于控制台对象不可用而无法运行,也可以。