由淺入深學習JavaScript Debug技巧

2021-03-02 GitChat精品課

作者 | Julie Pagano

翻譯 | Fundebug

譯者按:從alert到debugger;看看你屬於哪個段位。為了保證可讀性,本文採用意譯而非直譯。另外,本文版權歸原作者所有,翻譯僅用於學習。

我常常看到不少開發者不懂如何Debug JavaScript代碼,因此決定寫一篇博客為初學者介紹如何Debug。我希望這篇文章可以提供一些有用的信息。我嘗試在本文講述很多內容,所以有些部分並沒有講得很細。

在開始之前,做一些基本的準備:

注意:1. 你最好打開兩個窗口,一邊看一邊操作來學習;2. 本文的主要目的是教會你debug,文中的JavaScript代碼並不規範,不要學壞啦。


警告(alert)

使用警告(alert)會彈出一個對話框顯示特定的警告信息,並且有一個OK按鈕。如果你點擊OK,該對話框消失。

alert("Hello! I am an alert.");



這一招蠻有用的,你可以將想要查看的值通過alert顯示出來。

// 通過alert來確認代碼執行的位置

alert("I am here!");

// 顯示foo的值

alert("Foo: " + foo);

但如果你不小心將alert放在了for循環中,那就慘了。我曾經就遇到過,不得不強行將瀏覽器關閉。

// 除非你喜歡alert, 不要這樣做!

for (i = 0; i < 100; i++) {

  alert(i);

}

好在,如今的谷歌瀏覽器已經幫你考慮到這一點。如果你不小心弄出了很多alert,谷歌瀏覽器會識別出來並建議你將它們都阻止。



曾經,alert是大家非常常用的debug工具。不過,使用alert局限性太大,它只能顯示字符串。

// 顯示所有的h2標籤內容

alert($('h2'));

然而,並不會顯示出來:



既然這麼不好用,為啥你還要講呢?因為我們可能有時候不得不使用這樣舊式的技巧。我最近一次使用alert是我在debug一個行動裝置的時候現有的技巧無法正常工作,我只好用alert。


開發者工具

歡迎來到未來!哈哈,並不是這樣。開發者工具已經使用了好些年了。不過呢,很多新的特性被加進去,相信不少人都不知道或則不清楚怎麼使用。對於JavaScript debug來說,開發者工具真的非常有用。接下來我來介紹如何使用它。

首先,你需要知道如何打開它。你可以使用快捷鍵:

你也可以從谷歌瀏覽器的菜單欄選擇開發者工具選項來打開:



你還可以直接右鍵,選擇檢查來打開:



打開後,如下所示:


控制臺(Console

在使用JavaScript做開發的時候,控制臺非常有用。當使用C, C++, Java開發的時候,我們可以使用終端(terminal)來debug,控制臺擁有和終端相似的功能。


錯誤

控制臺顯示JavaScript錯誤。



同時,也顯示了錯誤在原始碼中的位置。點擊(index):150就可以跳轉到原始碼去。


<input type="button" onclick="alert(THE SPICE MUST FLOW);" value="Click to create an error">

這行代碼有錯誤,你知道哪裡出問題了嗎?


命令行

控制臺擁有的交互式命令行可以用來debug。下面是一些例子:

你可以做一些基礎的JavaScript編程

// 數學加法

2 + 2

// 字符串拼接

"the golden " + "path"

// 調用alert

alert("Muad'Dib!");

你也可以執行複雜的JavaScript代碼

// 創建變量

var arr = [1, 2, 3];

// 使用shitf+enter鍵來換行

for (var i = 0; i < arr.length; i++) {

  arr[i] = arr[i] * 2;

}

arr;

控制臺本身也提供了很多有用的函數,詳情參考api文檔(https://developer.chrome.com/devtools/docs/commandline-api)。

// 通過css選擇器獲取元素

$$('h2');

// 甚至XPath

$x('//h2');

你可以訪問本頁面加載的所有庫。比如,jQuery:

// 頁面背景色變紅

$('body').css('background-color', 'red');

// 改回去

$('body').css('background-color', '');

你可以獲取當前環境下的變量。

// 當前的this

this;

console.log

console.log在控制臺列印信息。

console.log("I am logging to the console.");


我們可以使用它做到之前alert可以實現的功能:

// 確認代碼當前執行位置

console.log("I am here!");

// 列印變量值

console.log("Foo: " + foo);

而且,我們可以用for循環將所有的值列印出來:

for (i = 0; i < 100; i++) {

  console.log(i);

}

alert只能顯示字符串,console.log就強大多了:

// 可以輸出DOM元素

console.log($('h2'));

// 可以顯示對象

console.log({

  book: "Dune",

  characters: ["Paul", "Leto", "Jessica", "Chani", "sandworms"]

});

這僅僅是個開始。使用console.log你可以做很多事情,請參考api文檔(https://developer.chrome.com/devtools/docs/console-api)。

控制臺列印日誌已經基本上可以應付日常debug需求了,所以很多開發者止步於此。其實,我們還有更加高級、更加方便的方法。


交互式Debugger

谷歌開發者工具提供了一個交互式debugger。我發現對於複雜的JavaScript代碼,特別是自己編寫的代碼和其它庫有交互的時候,特別有用。

你可以再代碼中通過調用debugger來開啟debug。

// 從這裡開始debug

debugger;

只有在打開開發者工具的時候,debugger才會起作用。如果你將開發者工具面板關閉,將不會收到任何影響。



如果你點擊繼續按鈕(右側藍色的類似於播放的按鈕),代碼會繼續執行直到下一個斷點。

如果你點擊跳過按鈕(繼續按鈕的右側,第二個),它會直接執行當前函數,而不是進入函數內部。



如果你想知道makeItColor函數具體如何執行,點擊進入按鈕(第三個),就會跳入函數內部。如果你想跳出來,那麼點擊第跳出按鈕(第四個)。



如果想查看變量的值,可以選中並把滑鼠放在上面:



你可以敲擊ESC鍵來快速打開控制臺,再次敲擊ESC,控制臺消失。


你可以手動在代碼的某一行添加斷點來暫停執行。在第31行的左側滑鼠單擊,會出現一個斷點符號。



庫和壓縮代碼

有時候,為了debug,你可能需要查看庫函數的原始碼。但是,一般線上的代碼都是經過壓縮的,很難看懂。比如jQuery:



如果你點擊下方的{}按鈕,可以將代碼適當格式化,但是依然很難看懂。



壓縮代碼在生產環境十分有必要,但是卻十分為難debug。好在,大多數庫都提供非壓縮版本的代碼。所以,你可以在開發中引用非壓縮版,線上引用壓縮版。

<!-- 線上 -->

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js" type="text/javascript"></script>

<!-- 開發 -->

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.js" type="text/javascript"></script>

在線上環境中,如果用戶遇到bug如何才能知道呢?推薦你使用fundebug監控服務(https://fundebug.com/)。


Ajax請求

開發者工具的網絡部分對於解決網絡請求相關問題非常有用。

我用Twitter來舉例。



往下滑動觸發網絡請求。Headers標籤顯示該請求的一些基本信息:



Preview顯示的是經過瀏覽器格式化的返回結果(Response)。



Response是原始的返回數據。



Cookies顯示請求相關的cookies信息。



Timing顯示請求的時間信息。



性能

Debug JavaScript的性能需要很多篇幅去介紹。在這裡,給出一些參考資料:

jsPerf(http://jsperf.com/)

Evaluating network performance(https://developer.chrome.com/devtools/docs/network)

Performance profiling with the Timeline(https://developer.chrome.com/devtools/docs/timeline)

Profiling JavaScript Performance(https://developer.chrome.com/devtools/docs/cpu-profiling)

JavaScript Memory Profiling(https://developer.chrome.com/devtools/docs/javascript-memory-profiling)


移動端

你可以使用開發者工具來模擬移動交互,這樣就可以直接在桌面瀏覽器debug。如果想了解更多,查看文檔(https://developer.chrome.com/devtools/docs/mobile-emulation)。

當然,你很可能需要真機調試,可以參考下面的文章:

Remote Debugging Chrome on Android(https://developer.chrome.com/devtools/docs/remote-debugging)

Quick Tip: Using Web Inspector to Debug Mobile Safari(http://webdesign.tutsplus.com/articles/quick-tip-using-web-inspector-to-debug-mobile-safari--webdesign-8787)

來源:https://blog.fundebug.com/2017/12/04/javascript-debugging-for-beginners/

相關焦點

  • 前端 debug 的奇技淫巧
    其實發現很多同學對一些很簡單又有效的 debug 手段都不太了解,找 bug 的方式都不是很高效,導致最終 bug 找不到或者走了很多彎路。Devtools作為前端開發,chrome 的 devtools 一定不陌生,下面講一講 devtools 裡面 debug 的一些思路。
  • 你不知道的16條JavaScript調試技巧
    但一旦你掌握技巧,了解了工具本身,便能節省一大把時間。以下16條調試技巧,可供您在下次調試JavaScript代碼時使用!這些技巧大多數都適用於Chrome和Firefox,許多技巧也可以與其他檢查員一起使用。
  • Eclipse的Debug介紹與技巧
    沒有任何程式設計師能夠一氣呵成的寫出沒有任何BUG的代碼,所以很多程式設計師有相當一部分時間是花費在Debug上的,程序調試是每個程式設計師必須面對的工作,如何使用Eclipse進行有效的、尤其是高效的進行代碼調試是一個值得學習的技巧。
  • 工具 | 常用 MySQL 內核 Debug 技巧
    /bin/mysqld --verbose --version回顯 debug 版本信息,則編譯的是 debug 版本。回顯包含了 debug 字樣,則編譯的是 debug 版本。Debug 示例安裝好 Debug 環境後,我們用以下兩個例子,來簡單演示使用思路及技巧。
  • 14個你可能不知道的JavaScript調試技巧
    儘管江湖傳言 JavaScript 很難調試,但如果你掌握了幾個技巧,就能用很少的時間來解決錯誤和 bug.文中已經列出了 14 個你可能不知道的調試技巧,但是可能需要你牢記在心,以便在下次需要調試 JavaScript 代碼時使用!
  • 14 個你可能不知道的 JavaScript 調試技巧
    (點擊上方公眾號,可快速關注)英文: raygun   譯文:oschinahttps:
  • go runtime debug 小技巧
    dlv命令行debugdlv的名頭應該不用我多說, 所以我們直奔主題1. 開始debugdlv debug test.go執行上述命令後, 就會進入debug交互命令行界面, 在這個界面任何時候輸入h都會列印幫助信息.2.
  • [Java學習] Eclipse的Debug調試技巧大全(總結)
    Step Filters : 這個功能比較簡單,就是當我們在debug的時候想要忽略一些我們不關注的類時,可以開啟Step Filters進行過濾,程序會一直執行直到遇到未經過濾的位置或斷點。使用這兩個功能就可以代替重新debugCopy Variables:複製變量的值,尤其在變量值很長(比如json數據)的時候,這個功能就派上用場了。Find:有的時候一個類中變量特別多的時候,可以進行查找。4)Breakpoints View (斷點視圖)
  • Eclipse的Debug調試技巧大全
    Eclipse的Debug調式技巧大全【面試+工作】一、Debug視圖調試中最常用的窗口是:
  • troubleshooting--回溯+debug
    上次提到troubleshooting ability框定了troubleshooting的框架,這次再講一個解決複雜問題的技巧--回溯+debug
  • 12 個非常有用的 JavaScript 技巧
    編譯自:https://blog.jscrambler.com/12-extremely-useful-hacks-for-javascript/
  • Javascript 實現複製(Copy)動作大全
    ><script language="javascript">function oCopy(obj){ obj.select(); js=obj.createTextRange(); js.execCommand("Copy") alert("複製成功!")
  • 12 個 GitHub 上超火的 JavaScript 奇技淫巧項目,找到寫 JavaScript 的靈感!
    大家好,我是你們的 貓哥,一個不喜歡吃魚、又不喜歡喵 的超級貓 ~前言貓哥是一個常年混跡在 GitHub 上的貓星人,所以發現了不少好的前端開源項目、常用技巧,在此分享給大家。平時如何發現好的開源項目,可以看看這篇文章:GitHub 上能挖礦的神仙技巧 - 如何發現優秀開源項目以下為【前端GitHub】的第 12 期精華內容。
  • 如何由淺入深的學習六爻?
    如何由淺入深的學習六爻?學習六爻,遠比學習八字更容易入門,而且比八字更有趣味。不過很多六爻的愛好者都不知道從何處下手,先看什麼書,再看什麼書。分不清主次,這樣就會給學習帶來很大的阻力,東一下,西一下的學習,永遠也理不出頭緒來。我根據自己的學習體會,推薦幾本書給大家參考。
  • 28個你應該知道的JavaScript技巧
    英文 | https://niemvuilaptrinh.medium.com/28-tip-javascript-you-should-know
  • JavaScript的14個調試技巧
    當今主流瀏覽器是 Chrome,本文分享的大多數技巧適用於Chrome的檢查器,也適用於Firefox,許多技巧也適用於其它瀏覽器的檢查器。只需使用 debug(functionName),腳本在運行到函數時停止。這個查找非常快,缺點是不適合用私有或匿名函數。(還有一個函數 console.debug,和我們說的不是一回事)。
  • 各種姿勢的debug(從python一路debug到C++)
    今天繼續聊一下VSCode對C++代碼的debug功能,更加深入更加強大!我們對Pytorch的debug一般都是在python端進行,這對於一般搭建模型的任務來說足夠了。但如果我們需要對Pytorch進行一些修改或者研究一下機器或深度學習系統是如何搭建的,想要深入探索就必須涉及到C++的源碼層面。
  • 20個常用的JavaScript簡寫技巧
    任何程式語言的簡寫技巧都能夠幫助你編寫更簡練的代碼,讓你用更少的代碼實現你的目標。讓我們一個個來看看 JavaScript 的簡寫技巧吧。 1. 聲明變量 2.
  • 網頁性能之html css javascript
    前言html css javascript可以算是前端必須掌握的東西了,但是我們的瀏覽器是怎樣解析這些東西的呢 我們如何處理html css javascript這些東西來讓我們的網頁更加合理,在我這裡做了一些實驗,總結起來給大家看看。
  • 網頁技巧:妥善處理JavaScript中的錯誤
    首頁 > 教程 > 關鍵詞 > 網頁最新資訊 > 正文 網頁技巧:妥善處理JavaScript中的錯誤