目錄
骨灰級調試大師Alert
新一代調試王者Console
JS斷點偵錯
Sources斷點
Debugger斷點
DOM斷點調試
當節點內部子節點變化時斷點(Break on subtree modifications)
當節點屬性改變時斷點(Break on attributes modifications)
當節點被移除時斷點(Break on node removal)
XHR Breakpoints
Event Listener Breakpoints
首頁 web前端 js教程 詳細介紹最全面的JavaScript調試技巧總結

詳細介紹最全面的JavaScript調試技巧總結

Mar 08, 2017 pm 02:49 PM

前言:調試技巧,在任何一項技術研發中都可謂是必備的技能。掌握各種調試技巧,必定能在工作上發揮事半功倍的效果。譬如,快速定位問題、降低故障機率、幫助分析邏輯錯誤等等。而在網路前端開發越來越重要的今天,如何在前端開發中降低開發成本,提升工作效率,掌握前端開發調試技巧尤其重要。

本文將一一講解各種前端JS調試技巧,也許你已經熟練掌握,那讓我們一起來溫習,也許有你沒見過的方法,不妨一起來學習,也許你尚不知如何調試,趕緊趁此機會填補空白。

骨灰級調試大師Alert

那還是互聯網剛起步的時代,網頁前端還主要以內容展示為主,瀏覽器腳本還只能為頁面提供非常簡單的輔助功能的時候。那時候,網頁主要運行在以IE6為主的瀏覽器中,JS的調試功能還非常弱,只能透過內建於Window物件中的alert方法來調試,那時候看起來應該是這個樣子:

詳細介紹最全面的JavaScript調試技巧總結

需要說明一點,這裡看到的效果,並非當年的IE瀏覽器中看到的效果,而是在高版本IE中的效果。此外,當年似乎還沒有這麼高級的控制台,而alert的使用也是在真實的頁面JS程式碼中。雖然,alert的調試方式很原始,但當時確實有它不可磨滅的價值,甚至到今天,已然有其用武之地。

新一代調試王者Console

隨著JS在Web前端中能做的事情越來越多,責任越來越大,而地位也越來越重要。傳統的alert調試方式已經漸漸無法滿足前端開發的種種場景。而且alert調試方式彈出的調試信息,那個窗口著實不太美觀,而且會遮擋部分頁面內容,著實有些不太友好。

另一方面,alert的偵錯訊息,必須在程式邏輯中加入類似」alert(xxxxx)」這樣的語句,才能正常運作,而alert會阻礙頁面的繼續渲染。這就意味著開發人員調試完成後,必須手動清除這些偵錯程式碼,實在有些麻煩。

所以,新一代的瀏覽器Firefox、Chrome,包括IE,都相繼推出了JS調試控制台,支持使用類似”console.log(xxxx)”的形式,在控制台打印調試信息,而不直接影響頁面顯示。以IE為例,它看起來像這樣:

詳細介紹最全面的JavaScript調試技巧總結

好吧,再見醜陋的alert彈出框。而以Chrome瀏覽器為首的後起之秀,為Console擴展了更豐富的功能:

詳細介紹最全面的JavaScript調試技巧總結

你以為這樣就滿足了? Chrome開發團隊的想像力實在不得不讓人佩服:

詳細介紹最全面的JavaScript調試技巧總結

好了,稍微多說了一點點題外話。總之,控制台以及瀏覽器內建Console物件的出現,為前端開發調試帶來了極大的便利。

有人會問,這樣的偵錯程式碼不一樣需要在調試完成後進行清理嗎?

關於這個問題,如果在使用console物件之前先進性存在性驗證,其實不刪除也不會對業務邏輯造成破壞。當然,為了程式碼整潔,在調試完成後,還是應盡可能刪除這些與業務邏輯無關的偵錯程式碼。

JS斷點偵錯

斷點,偵錯器的功能之一,可以讓程式中斷在需要的地方,以便方便其分析。也可以在一次調試中設定斷點,下一次只需讓程式自動運行到設定斷點位置,便可在上次設定斷點的位置中斷下來,極大的方便了操作,同時節省了時間。 ——百度百科

JS斷點調試,即是在瀏覽器開發者工具中為JS程式碼添加斷點,讓JS執行到某一特定位置停住,方便開發者對該處程式碼段的分析與邏輯處理。為了能夠觀察到斷點偵錯的效果,我們預先隨意準備一段JS程式碼:

詳細介紹最全面的JavaScript調試技巧總結

#程式碼很簡單,就是定義一個函數,傳入兩個數,分別加上一個亂七八糟的隨機整數後,再回傳兩個數的總和。以Chrome開發者工具為例,我們來看看JS斷點調試的基本方法。

Sources斷點

首先,測試程式碼中我們透過上圖console的輸出結果可以看出程式碼應該是正常運作了,但是為什麼是應該呢?因為函數中加了一個隨機數,而最終結果是否真的是正確的呢?這是毫無意義的猜想,但假設我現在就是要驗證一下:函數傳入的兩個數、被加的隨機數,以及最終的總和。那該怎麼操作呢?

方法一,前面講過最普通的,無論使用alert還是console,我們可以這麼來驗證:

詳細介紹最全面的JavaScript調試技巧總結

從上圖發現,我們在在程式碼中新增了三行console程式碼,用以列印我們關心的資料變量,而最終我們從控制台(Console面板)中的輸出結果,可以很清楚的驗證整個計算過程是否正常,進而達到我們題設的驗證要求。

方法二,方法一的驗證過程存在很明顯的弊端就是,增加了許多冗餘程式碼,接下來我們看一下使用斷點進行驗證,是否更加方便,先看一個如何加斷點,以及斷點後是什麼效果:

詳細介紹最全面的JavaScript調試技巧總結

如圖,給一段程式碼加入斷點的流程是「F12(Ctrl + Shift + I)開啟開發工具」— —「點選Sources選單」-「左側樹中找到對應檔案」-「點選行號列」即完成在目前行新增/刪除斷點操作。當斷點加入完畢後,刷新頁面JS執行到斷點位置停住,在Sources介面會看到目前作用域中所有變數和值,只需對每個值進行驗證即可完成我們題設驗證要求。

那問題來了,仔細的朋友會發現當我的程式碼執行到斷點的時候,顯示的變數a和b的值是已經進行過加法運算後的,我們看不到呼叫sum函數時初始傳入的10和20。那該怎麼辦呢?這就要回過頭來先學習一下斷點調試的一些基礎了。我們打開Sources面板後其實會在介面中看到如下內容,我們跟著滑鼠軌跡逐一看看都是什麼意思:

詳細介紹最全面的JavaScript調試技巧總結

從左到右,各個圖示表示的功能分別為:

  • Pause/Resume script execution:暫停/復原腳本執行(程式執行到下一個斷點停止)。

  • Step over next function call:執行到下一步的函數呼叫(跳到下一行)。

  • Step into next function call:進入目前函數。

  • Step out of current function:跳出目前執行函數。

  • Deactive/Active all breakpoints:關閉/開啟所有斷點(不會取消)。

  • Pause on exceptions:異常狀況自動斷點設定。

到此,斷點調試的功能鍵介紹得差不多了,接下來我們就可以一行一行去看我們的程式碼,查看每一行執行完畢之後,我們各個變量的變化情況了,如下圖所示:

詳細介紹最全面的JavaScript調試技巧總結

如上,我們可以看到a、b變數從最初值,到中間加上隨機值,再到最後計算總和並輸出最終結果的整個過程,完成題設驗證要求不在話下。

其餘幾個功能鍵,我們稍微改動一下我們的測試程式碼,用一張gif圖來示範他們的使用方法:

詳細介紹最全面的JavaScript調試技巧總結

這裡需要注意一點,直接在程式碼區列印變數值的功能是在較新版本的Chrome瀏覽器中才新增的功能,如果你還在使用較老版本的Chrome瀏覽器,可能無法直接在斷點的情況下查看變數訊息,此時你可以將滑鼠移到變數名上短暫停頓則會出現變數值。也可以用滑鼠選取變數名稱,然後右鍵「Add to watch」在Watch面板查看,此方法同樣適用於表達式。此外,你也可以在斷點情況下,切換到Console面板,直接在控制台輸入變數名稱,回車查看變數資訊。這部分比較簡單,考慮篇幅問題,不在做圖片示範。

Debugger斷點

所謂的Debugger斷點,其實是我自己為它命名的,專業術語我也不知道怎麼說。具體的說就是透過在程式碼中加入”debugger;”語句,當程式碼執行到該語句的時候就會自動斷點。接著的操作就跟在Sources面板加入斷點調試幾乎一模一樣,唯一的差別在於調試後需要刪除該語句。

既然除了設定斷點的方式不一樣,功能和Sources面板添加斷點效果一樣,那麼為什麼還會存在這種方式呢?我想原因應該是這樣的:我們在開發中偶爾會遇到非同步載入html片段(包含內嵌JS程式碼)的情況,而這部分JS程式碼在Sources樹種無法找到,因此無法直接在開發工具中直接新增斷點,那麼如果想為非同步載入的腳本新增斷點,此時」debugger;」就發揮作用了。我們直接透過gif圖看看他的效果:

詳細介紹最全面的JavaScript調試技巧總結

DOM斷點調試

DOM斷點,顧名思義就是在DOM元素上加入斷點,進而達到調試的目的。而在實際使用中斷點的效果最終還是落地到JS邏輯之內。我們依序來看每一種DOM斷點的具體效果。

當節點內部子節點變化時斷點(Break on subtree modifications)

在前端開發越來越複雜的今天,前端JS程式碼越來越多,邏輯越來越複雜,一個看似簡單的Web頁面,通常伴隨著大段大段的JS程式碼,涉及諸多DOM節點增、刪、改的操作。難免會遇到直接透過JS程式碼很難定位程式碼段的情況,而我們卻可以透過開發者工具的Elements面板,快速定位到相關DOM節點,這時候透過DOM斷點定位腳本就顯得尤其重要了。具體我們還是透過gif示範來看一下:

詳細介紹最全面的JavaScript調試技巧總結

上圖示範了對ul子節點(li)的增加、刪除以及交換順序操作觸發斷點的效果。但要注意的是,對子節點進行屬性修改和內容修改並不會觸發斷點。

當節點屬性改變時斷點(Break on attributes modifications)

另一方面,由於前端處理的業務邏輯越來越複雜,對某些資料的儲存依賴越來越強烈,而將臨時資料儲存於DOM節點的(自訂)屬性中,是許多情況下開發者優先選擇的方式。特別是在HTML5標準增強自訂屬性支援(例:dataset、data-*之類)之後,屬性設定應用越來越多,因此Chrome開發者工具也提供了屬性變更斷點支持,其效果大致如下:

詳細介紹最全面的JavaScript調試技巧總結

此方式同樣需要注意,對子節點的屬性進行任何操作也不會觸發節點本身的斷點。

當節點被移除時斷點(Break on node removal)

這個DOM斷點設定很簡單,觸發方式很明確-當節點被刪除時。所以通常情況應該是在執行”parentNode.removeChild(childNode)”語句的時候使用此方式。此方式使用不多。

前面介紹到的基本上是我們在日常開發中經常使用的調試手段,運用得當它們也幾乎能應對我們日常開發中的幾乎所有問題。但是,開發者工具也考慮到了更多的情況,提供更多的斷點方式,如圖:

詳細介紹最全面的JavaScript調試技巧總結

XHR Breakpoints

這幾年前端開發發生了翻天覆地的變化,從當初的名不見經傳到如今的盛極一時,Ajax驅動Web富應用,行動WebApp單頁應用風生水起。這一切都離不開XMLHttpRequest對象,而「XHR Breakpoints」正是專為非同步而生的斷點除錯功能。

XHR Breakpoints演示

我們可以透過「XHR Breakpoints」右側的「+」號碼為非同步斷點新增斷點條件,當非同步請求觸發時的URL滿足此條件,JS邏輯則會自動產生斷點。示範動畫中並沒有示範到斷點位置,這是因為,示範使用的是jQuery封裝好的ajax方法,程式碼已經過壓縮,看不到什麼效果,而事實上XHR斷點的產生位置是」xhr. send()」語句。

XHR斷點的強大之處是可以自訂斷點規則,這就意味著我們可以針對某一批、某一個,甚至所有非同步請求進行斷點設置,非常強大。但是,似乎這個功能在日常開發中用得不多,至少我用得不多。想想原因大概有兩點:其一,這類型的斷點調試需求在日常業務中本身涉及不多;其二,現階段的前端開發大多基於JS框架進行,最基本的jQuery也已經對Ajax進行了良好封裝,極少有人自己封裝Ajax方法,而專案為了減少程式碼體積,通常選擇壓縮後的程式碼庫,使得XHR斷點追蹤相對不那麼容易了。

Event Listener Breakpoints

事件監聽器斷點,即根據事件名稱進行斷點設定。當事件被觸發時,斷點到事件綁定的位置。事件監聽器斷點,列出了所有頁面及腳本事件,包括:滑鼠、鍵盤、動畫、計時器、XHR等等。極大的降低了事件方面業務邏輯的調試難度。

詳細介紹最全面的JavaScript調試技巧總結

示範實例示範了當click事件觸發時和當setTimeout被設定時的斷點效果。實例顯示,當選取click事件斷點之後,兩個按鈕的點擊時都觸發了斷點,而當setTimeout被設定時,「Set Timer」斷點被觸發。

調試,是在專案開發中非常重要的環節,不僅可以幫助我們快速定位問題,還能節省我們的開發時間。熟練各種調試手段,定當為你的職業發展帶來諸多利益,但是,在如此多的調試手段中,如何選擇一個適合自己當前應用場景的,這需要經驗,需要不斷嘗試積累。


以上是詳細介紹最全面的JavaScript調試技巧總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統 如何利用JavaScript和WebSocket實現即時線上點餐系統 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統 如何使用WebSocket和JavaScript實現線上預約系統 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

Laravel開發建議:如何進行效能最佳化與除錯 Laravel開發建議:如何進行效能最佳化與除錯 Nov 22, 2023 pm 05:46 PM

Laravel開發建議:如何進行效能最佳化與調試引言:Laravel是一款優秀的PHP開發框架,以其簡潔、高效和易用而受到廣大開發者的喜愛。然而,當應用程式遇到效能瓶頸時,我們需要進行效能最佳化和調試以提升用戶體驗。本文將介紹一些實用的技巧與建議,幫助開發者進行Laravel應用程式的效能最佳化與除錯。一、效能最佳化:資料庫查詢最佳化:減少資料庫查詢次數是效能最佳化的關

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

javascript如何使用insertBefore javascript如何使用insertBefore Nov 24, 2023 am 11:56 AM

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

See all articles