簡體   English   中英

window.console是做什么的?

[英]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.consolewindow.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM