[英]What does window.console do?
我試圖理解教程中的一些代碼,並且有一行:
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');
}
}
因此,這是一個測試,在嘗試調用該函數並可能獲取ReferenceError
之前,先查看window.console
和window.console.timeEnd
屬性是否存在。
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=zh-CN&redirectslug=DOM%2Fconsole.time ,如您所見,window.console IE中不支持.timeEnd,這就是為什么要進行這些檢查的原因。
這是正在發生的事情..基本上。 如果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具有短路評估功能 ,因此,如果window.console
為falsey,則將永遠不會評估window.console.timeEnd
(如果為false,它將失敗),如果window.console.timeEnd
為false,則console.timeEnd('Generated In')
將永遠不會被調用(如果被調用,它將失敗)。 換句話說,這是出於調試目的而啟動計時器的超級安全方式。
采取這種方法的一個原因是, 除非進行調試, 否則 IE的較早版本未定義控制台對象。 那會在腳本中創建看不見的運行時錯誤,這很糟糕。
解決此問題的另一種方法(我更喜歡這種方法)是存根要使用的對象和函數。 您在問題中詢問的方法的問題是,每次調用console.log()
或任何控制台計時器函數時,您都必須做同樣的事情。 羅y而效率低下! 不干 ! 使用存根,只需要做一次,然后就可以使用對象和方法,而不必擔心它們不存在。 例如:
// 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()
是某些瀏覽器中公開的計時器結束函數(請參見MDN的console.timeEnd )
上面的代碼正在測試,看是否有一個console
成員。 如果是這樣,它是否有一個timeEnd()
方法? 如果是這樣,請致電。
大致相當於:
if (window.console)
if (window.console.timeEnd)
window.console.timeEnd('Generated In');
前兩個表達式正在檢查以確保A.控制台對象存在並且B.它具有可以調用的方法。 第三個表達式只是調用該方法並傳入一個字符串,以便用戶可以在控制台中查看此輸出並查看簡單的計時結果。
代碼看起來確實很奇怪,但是當您意識到這只是一種防止JavaScript異常發生的技術時。 並非所有瀏覽器都可以使用一個控制台對象,因此在那種情況下,代碼將什么都不做。
這是一種防御性的編碼方式,如果由於控制台對象不可用而無法運行,則可以。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.