由淺入深學習JavaScript Debug技巧
- 2019 年 12 月 31 日
- 筆記
譯者按: 從 alert 到 debugger;看看你屬於哪個段位。
本文採用意譯,版權歸原作者所有
我常常看到不少開發者不懂如何 Debug JavaScript 程式碼,因此決定寫一篇部落格為初學者介紹如何 Debug。我希望這篇文章可以提供一些有用的資訊。我嘗試在本文講述很多內容,所以有些部分並沒有講得很細。
在開始之前,做一些基本的準備:
- 這是針對瀏覽器運行的 JavaScript,而不是 Node.js;
- 你需要有一定的編寫 JavaScript 的基礎;
- 你需要在概念上知道 Debug 是什麼;
- 你最好動起手來,邊看邊操作。
注意:1. 你最好打開兩個窗口,一邊看一邊操作來學習;2. 本文的主要目的是教會你 debug,文中的 JavaScript 程式碼並不規範,不要學壞啦。
目錄
- 警告(alert)
- 開發者工具
- 控制台(Console)
- 列印日誌(console.log)
- 互動式 Debugger
- 庫函數和壓縮程式碼
- Ajax 請求
- 性能
- 移動端
警告(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); }
好在,如今的Google瀏覽器已經幫你考慮到這一點。如果你不小心弄出了很多 alert,Google瀏覽器會識別出來並建議你將它們都阻止。

曾經,alert
是大家非常常用的 debug 工具。不過,使用alert
局限性太大,它只能顯示字元串。
// 顯示所有的h2標籤內容 alert($("h2"));
然而,並不會顯示出來:

既然這麼不好用,為啥你還要講呢?因為我們可能有時候不得不使用這樣舊式的技巧。我最近一次使用alert
是我在 debug 一個移動設備的時候現有的技巧無法正常工作,我只好用alert
。
開發者工具
歡迎來到未來!哈哈,並不是這樣。開發者工具已經使用了好些年了。不過呢,很多新的特性被加進去,相信不少人都不知道或則不清楚怎麼使用。對於 JavaScript debug 來說,開發者工具真的非常有用。接下來我來介紹如何使用它。
首先,你需要知道如何打開它。你可以使用快捷鍵:
- Window/Linux: ctrl + shift + I;
- OSX: cmd + opt + I
你也可以從Google瀏覽器的菜單欄選擇開發者工具選項來打開:

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

打開後,如下所示:

控制台(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 文檔。
// 通過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 文檔。
控制台列印日誌已經基本上可以應付日常 debug 需求了,所以很多開發者止步於此。其實,我們還有更加高級、更加方便的方法。
互動式 Debugger
Google開發者工具提供了一個互動式 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 監控服務。
Ajax 請求
開發者工具的網路部分對於解決網路請求相關問題非常有用。
我用 Twitter 來舉例。
- 到@horse_js(或則其它頁面)
- 打開開發者工具
- 點擊 Network 標籤
- 點擊 filter 圖標
- 選中 XHR(XMLHttpRequest), 將所有網路請求篩選出來

往下滑動觸發網路請求。Headers標籤顯示該請求的一些基本資訊:

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

Response是原始的返回數據。

Cookies顯示請求相關的 cookies 資訊。

Timing顯示請求的時間資訊。

性能
Debug JavaScript 的性能需要很多篇幅去介紹。在這裡,給出一些參考資料:
- jsPerf
- Evaluating network performance
- Performance profiling with the Timeline
- Profiling JavaScript Performance
- JavaScript Memory Profiling
移動端
你可以使用開發者工具來模擬移動交互,這樣就可以直接在桌面瀏覽器 debug。如果想了解更多,查看文檔。
當然,你很可能需要真機調試,可以參考下面的文章:
版權聲明
轉載時請註明作者 Fundebug以及本文地址: https://blog.fundebug.com/2017/12/04/javascript-debugging-for-beginners/