溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Chrome DevTools如何調(diào)試JavaScript

發(fā)布時(shí)間:2021-03-10 16:31:25 來(lái)源:億速云 閱讀:193 作者:TREX 欄目:web開(kāi)發(fā)

本篇內(nèi)容主要講解“Chrome DevTools如何調(diào)試JavaScript”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Chrome DevTools如何調(diào)試JavaScript”吧!

Java的特點(diǎn)有哪些

Java的特點(diǎn)有哪些 1.Java語(yǔ)言作為靜態(tài)面向?qū)ο缶幊陶Z(yǔ)言的代表,實(shí)現(xiàn)了面向?qū)ο罄碚?,允許程序員以優(yōu)雅的思維方式進(jìn)行復(fù)雜的編程。 2.Java具有簡(jiǎn)單性、面向?qū)ο?、分布式、安全性、平臺(tái)獨(dú)立與可移植性、動(dòng)態(tài)性等特點(diǎn)。 3.使用Java可以編寫(xiě)桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序等。


由淺入深說(shuō)一說(shuō)怎么樣在 Chrome DevTools 中調(diào)試 JavaScript。

一、案發(fā)現(xiàn)場(chǎng)

為了方便理解,我寫(xiě)了一個(gè)小demo。

點(diǎn)擊打開(kāi)demo;

在num1中輸入6;

在num2中輸入9;

點(diǎn)擊 num1+num2,按鈕下方的標(biāo)簽顯示 69,結(jié)果應(yīng)為 15,這就是我們需要斷點(diǎn)調(diào)試找出的 BUG 。

Chrome DevTools如何調(diào)試JavaScript

二、熟悉一下 Sources 面板

DevTools 可為更改 CSS、分析頁(yè)面加載性能和監(jiān)控網(wǎng)絡(luò)請(qǐng)求等不同的任務(wù)提供許多不同的工具。 我們就在 Sources 面板中調(diào)試 JavaScript。

通過(guò)按 Command+Option+I (Mac) 或 Control+Shift+I(Windows、Linux),打開(kāi) DevTools。 此快捷方式可打開(kāi) Console 面板。點(diǎn)擊 Sources 面板。

Sources 面板包含 3 個(gè)部分:

Chrome DevTools如何調(diào)試JavaScript

文件預(yù)覽 窗口。 此處列出頁(yè)面請(qǐng)求的每個(gè)文件。

代碼編輯 窗口。 在 文件預(yù)覽 窗口中選擇文件后,此處會(huì)顯示該文件的具體內(nèi)容。

JavaScript 調(diào)試 窗口。 包含檢查頁(yè)面 JavaScript 的各種工具。 如果 DevTools 窗口布局較窄,此窗口會(huì)顯示在 代碼編輯 窗口下方。

三、使用斷點(diǎn)暫停代碼

調(diào)試上面這種問(wèn)題的常用方法是將多個(gè) console.log() 語(yǔ)句插入代碼,以便在執(zhí)行腳本的時(shí)候檢查相關(guān)變量的值。

雖然 console.log() 方法可以完成任務(wù),但斷點(diǎn)可以更快完成此任務(wù)。 斷點(diǎn)可在執(zhí)行代碼的過(guò)程中暫停代碼,并在此時(shí)及時(shí)檢查所有相關(guān)變量的值。 與 console.log() 方法相比,斷點(diǎn)具有一些優(yōu)勢(shì):

  1. 使用 console.log(),需要手動(dòng)打開(kāi)源代碼,查找相關(guān)代碼,插入 console.log() 語(yǔ)句,然后重新加載此頁(yè)面,才能在控制臺(tái)中看到這些消息。 使用斷點(diǎn),無(wú)需了解代碼結(jié)構(gòu)即可暫停相關(guān)代碼。

  2. console.log()語(yǔ)句中,您需要明確指定要檢查的每個(gè)值。 使用斷點(diǎn),DevTools 會(huì)在暫停時(shí)及時(shí)顯示所有變量值。簡(jiǎn)言之,與 console.log() 方法相比,斷點(diǎn)可以更快地查找和修正 BUG 。

接下來(lái)我們開(kāi)始思考一開(kāi)始拋出的程序的運(yùn)作方式,我們可以根據(jù)經(jīng)驗(yàn)推測(cè)出,我們?cè)邳c(diǎn)擊num1+num2按鈕的時(shí)候觸發(fā)的 click 事件肯定和 6+9=69 計(jì)算不正確有關(guān)系。 因此,我們可能需要在 click 偵聽(tīng)器運(yùn)行的時(shí)候暫停代碼。
Event Listener Breakpoints 可以完成此任務(wù):

在 JavaScript 調(diào)試 窗口中,點(diǎn)擊 Event Listener Breakpoints 前面的展開(kāi)按鈕。 可以看見(jiàn) Animation、Canvas、Clipboard 等一系列事件;

在頁(yè)面輸入框中輸入num1和num2的值;

展開(kāi) Mouse 事件,每個(gè)事件旁都有一個(gè)復(fù)選框。勾選 click 復(fù)選框。 DevTools 現(xiàn)在可以在任何 click 事件偵聽(tīng)器運(yùn)行時(shí)自動(dòng)暫停。

點(diǎn)擊頁(yè)面中的num1+num2按鈕。此時(shí)頁(yè)面如下圖:

Chrome DevTools如何調(diào)試JavaScript

這是因?yàn)槲已b的瀏覽器插件導(dǎo)致的定位不準(zhǔn),最好在無(wú)痕模式進(jìn)行操作。不過(guò)也不影響,我們點(diǎn)擊一下最左邊頁(yè)面上的藍(lán)色按鈕,再點(diǎn)擊中間的打括號(hào)(格式化代碼),就可以定位準(zhǔn)確并且格式化好代碼:

Chrome DevTools如何調(diào)試JavaScript

四、檢查變量的值

1. Scope窗口

在某代碼行暫停時(shí),Scope 窗格會(huì)顯示當(dāng)前定義的局部和全局變量,以及各變量值。 其中還會(huì)顯示閉包變量(如果適用)。 雙擊變量值可進(jìn)行編輯。 如果不在任何代碼行暫停,則 Scope 窗格為空。

Chrome DevTools如何調(diào)試JavaScript

2. Watch監(jiān)聽(tīng)變量變化

Watch 標(biāo)簽可監(jiān)視變量值隨時(shí)間變化的情況。 并且,監(jiān)視不僅限于監(jiān)視變量。 我們可以將任何有效的 JavaScript 表達(dá)式存儲(chǔ)在監(jiān)視表達(dá)式中。 我們嘗試這樣:
- 點(diǎn)擊 Watch 標(biāo)簽。
- 點(diǎn)擊 右邊的 + 添加表達(dá)式。
- 輸入 typeof n。 按 Enter 鍵。(這里代碼是打包后的,n表示num1輸入框的值)
- DevTools 會(huì)顯示 typeof n: "string"。 冒號(hào)右側(cè)的值就是監(jiān)視表達(dá)式的結(jié)果。

Chrome DevTools如何調(diào)試JavaScript

3. 控制臺(tái)

控制臺(tái)除了查看 console.log() 消息以外,還可以使用控制臺(tái)對(duì)任意 JavaScript 語(yǔ)句求值。 對(duì)于調(diào)試,可以使用控制臺(tái)測(cè)試 BUG 的潛在解決方法:

在 Console 中,輸入 `parseInt(n) + parseInt(u)`。 此語(yǔ)句有效,因?yàn)槲覀儠?huì)在特定代碼行暫停,其中 `n`(num1的值) 和 `u`(num2的值) 在范圍內(nèi)。

按 Enter 鍵。 DevTools 對(duì)語(yǔ)句求值并打印輸出 15,即我們預(yù)計(jì)demo頁(yè)面會(huì)產(chǎn)生的結(jié)果。

五、嘗試修改

上一步我們已找到解決 BUG 的方法。 接下來(lái)就是嘗試通過(guò)編輯代碼并重新運(yùn)行demo來(lái)使用修正方法。 我們可以在 代碼編輯 窗口直接修改代碼:

在 代碼編輯 窗口中,將代碼格式化關(guān)掉,然后修改代碼,將 n+u 換成 parseInt(n)+parseInt(u) 。

Chrome DevTools如何調(diào)試JavaScript

Command+S (Mac) 或 Control+S(Windows、Linux)以保存更改。

點(diǎn)擊 Deactivate breakpoints 取消激活斷點(diǎn)。 其將變?yōu)樗{(lán)色,表示處于活動(dòng)狀態(tài)。 在完成此設(shè)置后,DevTools 會(huì)忽略您已設(shè)置的任何斷點(diǎn)。

Chrome DevTools如何調(diào)試JavaScript

點(diǎn)擊num1+num2按鈕,則會(huì)看見(jiàn)正確的結(jié)果啦!

Tips: 這樣做只能修正在瀏覽器中運(yùn)行的代碼, 不能為訪問(wèn)您頁(yè)面的所有用戶修正代碼。 為此,我需要修改自己服務(wù)器上的代碼。

六、介紹其他幾種斷點(diǎn)

斷點(diǎn)類型使用場(chǎng)景
代碼行在確切的代碼區(qū)域中
條件代碼行在確切的代碼區(qū)域中,且僅當(dāng)其他一些條件成立時(shí)
DOM在更改或移除特定 DOM 節(jié)點(diǎn)或其子級(jí)的代碼中
XHR當(dāng) XHR 網(wǎng)址包含字符串模式時(shí)
事件偵聽(tīng)器在觸發(fā) click 等事件后運(yùn)行的代碼中
異常在引發(fā)已捕獲或未捕獲異常的代碼行中
函數(shù)任何時(shí)候調(diào)用特定函數(shù)時(shí)

1. 代碼行斷點(diǎn)

直接點(diǎn)擊

這是使用最多的一種斷點(diǎn)方式,在知道需要檢查的確切代碼區(qū)域時(shí),可以使用代碼行斷點(diǎn)。 DevTools 始終會(huì)在執(zhí)行此代碼行之前暫停。

Chrome DevTools如何調(diào)試JavaScript

debugger

在代碼中調(diào)用 debugger 可在該行暫停。 此操作相當(dāng)于使用代碼行斷點(diǎn),只是此斷點(diǎn)是在代碼中設(shè)置,而不是在 DevTools 界面中設(shè)置。

console.log('a');
console.log('b');
debugger;
console.log('c');

條件代碼斷點(diǎn)
如果知道需要調(diào)查的確切代碼區(qū)域,但只想在其他一些條件成立時(shí)進(jìn)行暫停,則可使用條件代碼行斷點(diǎn)。若要設(shè)置條件代碼行斷點(diǎn):

  1. 點(diǎn)擊 Sources 標(biāo)簽。

  2. 打開(kāi)包含您想要中斷的代碼行的文件。

  3. 轉(zhuǎn)至代碼行。

  4. 代碼行的左側(cè)是行號(hào)列。

  5. 右鍵點(diǎn)擊行號(hào)列。

  6. 選擇 Add conditional breakpoint。

  7. 代碼行下方將顯示一個(gè)對(duì)話框。

  8. 在對(duì)話框中輸入條件。

  9. 按Enter 鍵激活斷點(diǎn)。 行號(hào)列頂部將顯示一個(gè)橙色圖標(biāo)。

Chrome DevTools如何調(diào)試JavaScript

2. DOM更新斷點(diǎn)

如果想要暫停更改 DOM 節(jié)點(diǎn)或其子級(jí)的代碼,可以使用 DOM 更改斷點(diǎn)。若要設(shè)置 DOM 更改斷點(diǎn):

  • 點(diǎn)擊 Elements 標(biāo)簽。

  • 轉(zhuǎn)至要設(shè)置斷點(diǎn)的元素。

  • 右鍵點(diǎn)擊此元素。

  • 將鼠標(biāo)指針懸停在Break on 上,然后選擇 Subtree modifications、Attribute modifications 或 Node removal。

Chrome DevTools如何調(diào)試JavaScriptSubtree

  • modifications: 在移除或添加當(dāng)前所選節(jié)點(diǎn)的子級(jí),或更改子級(jí)內(nèi)容時(shí)觸發(fā)這類斷點(diǎn)。在子級(jí)節(jié)點(diǎn)屬性發(fā)生變化或?qū)Ξ?dāng)前所選節(jié)點(diǎn)進(jìn)行任何更改時(shí)不會(huì)觸發(fā)這類斷點(diǎn)。

  • Attributes modifications:在當(dāng)前所選節(jié)點(diǎn)上添加或移除屬性,或?qū)傩灾蛋l(fā)生變化時(shí)觸發(fā)這類斷點(diǎn)。

  • Node Removal:在移除當(dāng)前選定的節(jié)點(diǎn)時(shí)會(huì)觸發(fā)。

4. XHR/Fetch斷點(diǎn)

如果想在 XHR 的請(qǐng)求網(wǎng)址包含指定字符串時(shí)中斷,可以使用 XHR 斷點(diǎn)。 DevTools 會(huì)在 XHR 調(diào)用 send() 的代碼行暫停。

注:此功能還可用于 Fetch 請(qǐng)求。

例如,在您發(fā)現(xiàn)您的頁(yè)面請(qǐng)求的是錯(cuò)誤網(wǎng)址,并且您想要快速找到導(dǎo)致錯(cuò)誤請(qǐng)求的 AJAX 或 Fetch 源代碼時(shí),這類斷點(diǎn)很有用。

若要設(shè)置 XHR 斷點(diǎn):

  • 點(diǎn)擊 Sources 標(biāo)簽。

  • 展開(kāi) XHR Breakpoints 窗格。

  • 點(diǎn)擊 Add breakpoint。

  • 輸入要對(duì)其設(shè)置斷點(diǎn)的字符串。 DevTools 會(huì)在 XHR 的請(qǐng)求網(wǎng)址的任意位置顯示此字符串時(shí)暫停。

  • 按 Enter 鍵以確認(rèn)。

Chrome DevTools如何調(diào)試JavaScript

這樣就可以攔截包含getUserInfo字符串的請(qǐng)求,如果添加一個(gè)空的,則可以攔截所有請(qǐng)求!

5. 事件偵聽(tīng)器斷點(diǎn)

如果想要暫停觸發(fā)事件后運(yùn)行的事件偵聽(tīng)器代碼,可以使用事件偵聽(tīng)器斷點(diǎn)。 您可以選擇 click 等特定事件或所有鼠標(biāo)事件等事件類別。

我們一開(kāi)始使用的例子就是事件偵聽(tīng)器斷點(diǎn),這里就不演示了。

6. 異常斷點(diǎn)

如果想要在引發(fā)已捕獲或未捕獲異常的代碼行暫停,可以使用異常斷點(diǎn)。

  • 點(diǎn)擊 Sources 標(biāo)簽。

  • 點(diǎn)擊 Pause on exceptions 引發(fā)異常時(shí)暫停 {:.devtools-inline}。 啟用后,此按鈕變?yōu)樗{(lán)色。

  • (可選)如果除未捕獲異常以外,還想在引發(fā)已捕獲異常時(shí)暫停,則勾選 Pause On Caught Exceptions 復(fù)選框。

Chrome DevTools如何調(diào)試JavaScript

7.函數(shù)斷點(diǎn)

如果想要在調(diào)用特定函數(shù)時(shí)暫停,可以調(diào)用 debug(functionName),其中 functionName 是要調(diào)試的函數(shù)。 您可以將 debug() 插入您的代碼(如 console.log() 語(yǔ)句),也可以從 DevTools 控制臺(tái)中進(jìn)行調(diào)用。 debug() 相當(dāng)于在第一行函數(shù)中設(shè)置代碼行斷點(diǎn)。

function sum(a, b) {
 let result = a + b; // DevTools 會(huì)在此行暫停
 return result;
}
debug(sum); // 傳遞函數(shù)對(duì)象,而不是字符串。
sum();

如果想要調(diào)試的函數(shù)不在范圍內(nèi),DevTools 會(huì)引發(fā) ReferenceError

(function () {
 function hey() {
 console.log('hey');
 }
 function yo() {
 console.log('yo');
 }
 debug(yo); // 這行可以成功調(diào)用
 yo();
})();
debug(hey); // 這一行不能成功調(diào)用 hey() 不在作用域內(nèi)

如果是從 DevTools 控制臺(tái)中調(diào)用 debug(),則很難確保目標(biāo)函數(shù)在范圍內(nèi)。所以一般還不如直接使用代碼行斷點(diǎn)!


到此,相信大家對(duì)“Chrome DevTools如何調(diào)試JavaScript”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI