實用 JavaScript 調試技巧

大家好,我是若川。持續組織了8個月源碼共讀活動,感興趣的可以點此加我微信 ruochuan12?參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》?包含20余篇源碼文章。歷史面試系列。另外:目前建有江西|湖南|湖北?籍 前端群,可加我微信進群。

作為前端開發,我們會經常使用 console.log() 來調試程序中的問題。雖然這種方式也能解決一部分問題,但是它的效率不如能執行逐步調試的工具。本文就來學習一下如何使用 Google Chrome developer tools 輕松調試 JavaScript 代碼。

多數瀏覽器都提供了DevTools 供我們調試 JavaScript 應用程序,并且它們的使用方式類似,只要我們學會了如何在一個瀏覽器上使用調試工具,就很容易在其他瀏覽器上使用它。

以下就以 Greet Me 程序為例,這個程序非常簡單,只需輸入名字和愿望,最后會輸出一句話:

0511ee1b534d748701ccea3f9d812759.png

當輸入兩個表單值之后,“愿望”部分沒有正確打印,而是打印出了NaN。代碼在線調試:https://greet-me-debugging.vercel.app/。接下來,就看看 Chrome DevTools 有什么功能可以調試定位代碼的問題。

一、了解 Sources 面板

DevTools 提供了許多不同的工具供我們進行調試,包括 DOM 檢查、分析和網絡調用檢查等。這里要說的是 Sources 面板,它可以幫助我們調試 JavaScript。可以使用快捷鍵 F12 打開控制面板,并單擊 Sources 選項卡以導航到 Sources 面板,也可以直接使用快捷鍵 Command+Option+I(Mac)或 Control+Shift+I(Windows、Linux)來打開。

95f7af444fecb345b8c48150b51c0945.png

Sources 面板主要由三個部分組成:

7efb4e0088fcee01583c0b778fd5f7e1.png
  1. 文件導航區:頁面請求的所有文件都會在此列出;

  2. 代碼編輯區:當我們從文件導航欄中選取一個文件時,該文件的內容就會在此列出,我們可以在這里編輯代碼;

  3. Debugger區:這里會有很多工具可以用來設置斷點,檢查變量值、觀察執行步驟等。

如果 DevTools 窗口較寬或未在單獨的窗口中打開,則調試器部分將顯示在代碼編輯器的右側:

539262e518bf873b1e8e3a6a51ee9e1a.png

二、設置斷點

要開始調試代碼,首先要做的就是設置斷點,斷點就是代碼執行暫停以便調試它的邏輯點。

DevTools 允許我們以不同的方式來設置斷點:

  • 在代碼行;

  • 在條件語句中;

  • 在 DOM 節點處;

  • 在事件偵聽器上。

1. 在代碼行設置斷點

設置代碼行斷點的步驟:

  • 單擊切換到 Sources 選項卡;

  • 從文件導航部分選中需要調試的源文件;

  • 在右側代碼編輯器區域找到需要調試的代碼行;

  • 單擊行號以在行上設置斷點。

28b7cfdbb2dd81fcf11cf1b09fe18267.png

這里就在代碼的第 6 行設置了一個斷點,代碼在執行到這里時就會暫停。

2. 設置條件斷點

設置條件斷點的步驟:

  • 單擊切換到 Sources 選項卡;

  • 從文件導航部分選中需要調試的源文件;

  • 在右側代碼編輯器區域找到需要調試的代碼行;

  • 右鍵單擊行號并選擇"Add conditional breakpoint"來添加條件斷點:

d3e68ebbb29123542f7cf01b59dfab0c.png

點擊之后代碼行下方就會出現一個對話框,輸入斷點的條件即可:

661b4c67561122a1c85ed6974b629855.png

按回車鍵(Enter)即可激活斷點,這時就會在打斷點行的頂部出現一個橙色的圖標:

d8e53303b39577f765290d2ae6e1fa24.png

當print()方法中的name變量值為Joe時,代碼的執行就會暫停。需要注意,只有我們確定調試的代碼的大致范圍時,才會使用條件斷點。

3. 在事件監聽器上設置斷點

在事件監聽器上設置斷點的步驟:

  • 單擊切換到 Sources 選項卡;

  • 在debugger區域展開Event Listener Breakpoints選項;

  • 從事件列表中選擇事件監聽器來設置斷點。我們的程序中有一個按鈕單擊事件,這里就選擇 Mouse 事件選項中的click。

49105b24dcbbd1581db674b3cb99dae1.png

提示:當我們想暫停在事件觸發后運行的事件偵聽器代碼時可以使用此選項。

4. 在 DOM 節點中設置斷點

DevTools 在 DOM 檢查和調試方面同樣很強大。當在 DOM 中添加、刪除或者修改某些內容時,可以設置斷點來暫停代碼的執行。

在 DOM 上設置斷點的步驟:

  • 單擊切換到 Elements 選項卡;

  • 找到要設置斷點的元素;

  • 右鍵單擊元素以獲得上下文菜單,選擇Break on選項,然后選擇Subtree modifications、Attribute modifications、Node removal中的一個即可:

85a160cbd4290cec23bb5d2c66194ad5.png

這三個選項的含義如下:

  • Subtree modifications:當節點內部子節點變化時斷點;

  • Attribute modifications:當節點屬性發生變化時斷點;

  • Node removal:當節點被移除時斷點。

如上圖,我們在輸出消息的 div 的 DOM 發生變化時設置了一個斷點。當點擊按鈕后,問候消息輸出到 div 中,子節點的內容發生了變化,就會發生中斷。

注意: 當我們懷疑是DOM更改導致了錯誤時,就可以使用該選項,當 DOM 更改中斷時,相關的 JavaScript 代碼執行將自動暫停。

三、逐步調試

現在我們知道了設置斷點的方式。在復雜的調試情況下,我們可能需要使用這些調試的組合。調試器提供了五個控件來逐步執行代碼:

d0d0f260289c825706b189fcd9dee585.png

下面就分別來看看這些控制都是如何使用的。

1. 下一步(快捷鍵:F9)

此選項使我們能夠在JavaScript代碼執行時逐行執行,如果中途有函數調用,單步執行也會進入函數內部,逐行執行,然后退出。

693e2dffff817935035859bcf988f895.gif

2. 跳過(快捷鍵:F10)

此選項允許我們在執行代碼時跳過一些代碼。有時我們可能已經確定某些功能是正常的,不想花時間去檢查它們,就可以使用跳過選項。

下面就是單步執行logger()函數時,會跳過函數的執行:

16f6e16063cab6e267ab44c9ba29b9fd.gif

3. 進入(快捷鍵:F11)

使用該選項可以更深入地了解函數。單步執行函數時,當感覺某個函數的行為異常并想檢查它時,就可以使用這個選項來進入函數內部并進行調試。

下面就是單步執行 logger() 函數:

81c567e2c972ee618d4837c90a33c488.gif

4. 跳出(快捷鍵:Shift+F11)

在單步執行一個函數時,我們可能不想再繼續執行并退出它,就可以使用這些選項退出函數。

下面就是進入了 logger() 函數內部,然后立即退出:

75d3281687fbe9ba776aa2b4ff878099.gif

5. 跳轉(快捷鍵:F8)

有時,我們希望從一個斷點跳轉到另一個斷點,而無需在它們之間進行任何調試,就可以使用這個選項來跳轉到下一個斷點:

5f72c418aeb4382f23372d28fd4834c1.gif

四、檢查范圍、調用堆棧和值

當進行逐行調試時,檢查變量的范圍和值以及函數調用的調用堆棧。在Debugger區可以這三個選項:

bccc7de48c5b226be66b0f1075f0b4c0.png

1. 范圍(Scope)

可以在 Scope 選項中查看局部范圍和全局范圍內的內容以及變量,還可以看到 this 的實時指向:

af47f993e3cf7ff10f3aa01e72bf5504.png

2. 調用堆棧

調用堆棧面板有助于識別函數執行堆棧:

f868cfd98bcb3faec1c2e8f3e0727dc8.png

3. 值

檢查代碼中的值是識別代碼中錯誤的主要方法。在單步執行時,我們只需要將鼠標懸停在變量上即可檢查值。

下面可以看到變量 name 在代碼執行時的檢查值:

4b6853ff361f50afd6514b00179058c9.png

此外,我們可以選擇打碼的一部分作為表達式來檢查值。在下面的例子中,選擇了表達式document.getElementById('m_wish') 來檢查值:

c9c56641890d3f1e4600df2a042a218e.png

4. Watch

Watch 部分允許添加一個或多個表達式,并在執行時監視它們的值。當我們想在代碼邏輯之外進行一些計算時,這個功能非常有用。我們可以組合來自代碼區域的任何變量,以形成有效的JavaScript表達式。在逐步執行時,就能看到表達式的值。

以下是添加 Watch 的步驟:

  1. 單擊 Watch 上的 + 按鈕:

830312508311c0fbfec2001f9c271a92.png
  1. 添加要監控的表達式。在這個例子中,添加了一個希望觀察其值的變量:

82870a3070d449c8a035719769d782f9.png

另一種觀察表達式值的方法是從控制臺的console中添加:

e6b21e1b7cf7240a4551ca89f9065aea.png

五、禁用和刪除斷點

可以點擊以下按鈕來禁用所有的斷點:

b2c9499a9a7d451842a36b509f17fdbd.png注意,上述方法不會刪除斷點,只會在暫時停用它們。要再次激活這些斷點,只需再點一次這個斷點即可。

通過取消選中的復選框,可以從“Breakpoints”面板中刪除一個或多個斷點。通過右鍵單擊并選擇“刪除所有斷點”選項,可以刪除所有斷點:

5e882503d5bf4a41cc5a1d1608b75f16.png

六、使用 VS Code 調試 JavaScript

Visual Studio code 中一些實用的插件可以用于 JavaScript 代碼的調試。可以安裝一個名為“Debugger for Chrome”的插件來調試代碼:

26d9b1615f36939ee90407c988e10003.png

安裝之后,單擊左側的 run 選項并創建配置以運行/調試 JavaScript 應用程序。

f41bd5235248880ca87b1402b2c8dc23.png

這樣就會創建一個名為 launch.json 的文件,其中包含一些設置信息:

{"version":?"0.2.0","configurations":?[{"type":?"chrome","request":?"launch","name":?"Debug?the?Greet?Me?app","url":?"<http://localhost:5500>","webRoot":?"${workspaceFolder}"}]
}

可以修改以下參數:

  • name : 任意名稱;

  • url:本地運行的 URL;

  • webRoot:默認值為 ${workspaceFolder},即當前文件夾。可能將其更改為 項目入口文件即可。

最后一步是通過單擊左上角的播放圖標開始調試:

81b5f58cdb693c3e9513f281b642676b.png

這個調試器類似于DevTools,主要有以下部分:

  1. 啟用調試。按播放按鈕啟用調試選項。

  2. 用于單步執行斷點以及暫停或停止調試的控件。

  3. 在源代碼上設置斷點。

  4. 范圍面板查看變量范圍和值。

  5. 用于創建和監視表達式的監視面板。

  6. 執行函數的調用棧。

  7. 要啟用、禁用和刪除的斷點列表。

  8. 調試控制臺讀取控制臺日志消息。

f966e35c33f6ec279475a2025ea5bc4d.png

最后,回到最開始的問題,這里不再一步步調試,通過上述的調試方法判定,只需要在 wish 變量前面加一個 + 即可:

const?message?=?'Hello?'?+?name?+?',?Your?wish?`'?+?+?wish?+?'`?may?come?true!';

本文翻譯自 Tapas Adhikary 的原創文章,已獲得作者翻譯、轉載授權!

作者:Tapas Adhikary

譯者:CUGGZ

原文鏈接:https://blog.greenroots.info/the-definitive-guide-to-javascript-debugging-2021-edition

9ee0343395a9b8a98ce139924f3356ad.gif

·················?若川簡介?·················

你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列》20余篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結,已經堅持寫了8年,點擊查看年度總結。
同時,最近組織了源碼共讀活動,幫助3000+前端人學會看源碼。公眾號愿景:幫助5年內前端人走向前列。

2bf4d6f464523860df230bd4714c70bc.png

掃碼加我微信 ruochuan02、拉你進源碼共讀

今日話題

目前建有江西|湖南|湖北?籍 前端群,想進群的可以加我微信 ruochuan12?進群分享、收藏、點贊、在看我的文章就是對我最大的支持~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274743.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274743.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274743.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據挖掘 點擊更多 界面_6(更多)技巧,可快速改善用戶界面

數據挖掘 點擊更多 界面重點 (Top highlight)Creating beautiful, usable, and efficient UIs takes time, with many design revisions along the way.創建漂亮&#xff0c;可用和高效的UI需要花費時間&#xff0c;并且在此過程中進行了許多設計修訂。 Making those constant…

簡單的ASP.NET無刷新分頁

1、新建一個分頁存儲過程&#xff1a; CREATE procedure [dbo].[P_Pager] (PageNumber int, PageSize int) as declare sql nvarchar(4000) set sql select top Convert(varchar, PageSize) * from T_Test where [type]1 and id not in (select top Convert(…

Koa在實際的業務場景中,路由如何做分割?【文末留言送書】

大家好&#xff0c;我是若川。文末留言送書&#xff0c;具體規則文末說明。另外為了鼓勵大家多寫源碼共讀筆記&#xff0c;我會在寫了5次及以上筆記的作者群里也抽獎送這本書。以后也會有更多福利傾斜。導讀&#xff1a;Koa是一個Node框架&#xff0c;在Node開源社區中&#xf…

設計模式_設計

設計模式Thanks for my colleague WanChing‘s help to prepare this sharing article. E-Commerce app collects plentiful products from various brands. Each brand has its brand signature colors and public image. This article introduces how we made a single page …

動態切換css

方法一&#xff1a;給link一個id&#xff0c;直接獲取該DOM操作href <link rel"stylesheet" id"stylelink" type"text/css"/> <a href"#" οnclickjavascript:document.getElementById("stylelink").href "…

使用 GTD 優化自己的工作和生活

大家好&#xff0c;我是若川。持續組織了8個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…

模仿不再受寵若驚

If you haven’t heard of the Jio-Zoom plagiarism clash, you’re probably living under a rock (which may not be a bad idea given the state of the world right now). The turf war between Jio Meet and Zoom began when the Indian telecom giant ripped off the Chi…

一個計算機愛好者的不完整回憶(二十八)關于計算機書籍

我只在大學階段在圖書館看了很多計算機方面的書&#xff0c;無論已經老得都殘破了還是最新出版的。前兩天又看到論壇中有關于計算機書籍特別是國內人士編寫或翻譯的計算機書籍的評論的文章&#xff0c;譚浩強老先生又毫無懸念的被牽連了進來。也發表一下自己的一些觀點吧。   …

Vue2剝絲抽繭-響應式系統 系列

大家好&#xff0c;我是若川。持續組織了8個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…

word文本樣式代碼樣式_使用文本樣式表達創建真相來源

word文本樣式代碼樣式As of After Effects 17.0, you can use expressions to edit text styles in After Effects. Here’s why this would transform your workflow:從After Effects 17.0開始&#xff0c;您可以使用表達式在After Effects中編輯文本樣式。 這就是這將改變您的…

mvn備忘

創建web工程 mvn archetype:generate -DgroupIdcom.malangmedia -DartifactIdautoDeployToJetty -DarchetypeArtifactIdmaven-archetype-webapp -Dversion1.0 添加jetty插件 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.or…

前端框架源碼解讀之Vite

前端工具鏈十年盤點&#xff1a;https://mp.weixin.qq.com/s/FBxVpcdVobgJ9rGxRC2zfgWebpack、Rollup 、Esbuild、Vite ?webpack: 基于 JavaScript 開發的前端打包構建框架&#xff0c;通過依賴收集&#xff0c;模塊解析&#xff0c;生成 chunk&#xff0c;最終輸出生成的打包…

hp-ux_UX中的格式塔-或-為什么設計師如此討厭間距

hp-uxI’ve been lucky so far in my design career to have worked with engineers that seem genuinely interested in learning about design. Perhaps, as mentioned in the title, it’s more about them trying to figure out why it matters so much to us that there i…

很多人都不知道,其實博客園給我們博客開了二級域名

如題。一直都在郵件簽名里寫自己的博客地址為&#xff1a; http://www.cnblogs.com/datacool&#xff1b;直到有天突然發現使用&#xff1a;http://datacool.cnblogs.com也可以訪問。不知道的趕緊測試&#xff0c;后者明顯要酷很多啊。該不是我是最后一個知道的吧&#xff0c;知…

JavaScript 數組新增 4 個非破壞性方法!

大家好&#xff0c;我是若川。持續組織了8個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…

自行車改裝電動車怎么樣_電動車聽起來應該是什么樣?

自行車改裝電動車怎么樣The sound of an all-electric car accelerating doesn’t have to sound like a standard combustion engine, It could sound like anything.全電動汽車加速的聲音不必聽起來像是標準的內燃機&#xff0c;它可以聽起來像任何東西。 These were the wor…

C++中的三種繼承public,protected,private(轉)

三種訪問權限 public:可以被任意實體訪問 protected:只允許子類及本類的成員函數訪問 private:只允許本類的成員函數訪問 三種繼承方式 public 繼承 protect 繼承 private 繼承 組合結果 基類中 繼承方式 子類中 public &#xff06; public繼承 > public public &#xff0…

如何碎片化時間學前端,了解前沿趨勢

我很開心在前端行業認識了一批優秀且樂于分享的朋友&#xff0c;他們的技術分享與職業觀點讓我獲益良多&#xff0c;推薦給大家一起關注。程序員成長指北Node.js 前端工程化 低代碼考拉小姐姐&#xff0c;一個有趣且樂于分享的人&#xff01;目前就職于某知名外企&#xff0c;負…

谷歌pay破解_Google Pay缺少Google聞名的一件事-UX案例研究

谷歌pay破解Disclaimer: The views expressed in the blog post is purely based on personal experience. It was not influenced by any external factor.When Google launched Tez (now Google Pay) in India during 2017, their primary goal was to design a simple payme…

進階高級前端,這位大前端架構師一定不能錯過

今天給大家介紹一位好朋友&#xff1a;這波能反殺&#xff1a;一位擁有十年工作經驗&#xff0c;對學習方法有獨到理解的資深大前端架構師。一、博客早在 2017 年初&#xff0c;波神在簡書平臺以《前端基礎進階》為名&#xff0c;更新了一系列優質文章&#xff0c;獲得大量認可…