JavaScript如何調(diào)試有哪些建議和技巧附五款有用的調(diào)試工具
以下內(nèi)容是關(guān)于javascript如何調(diào)試有哪些建議和技巧的相關(guān)知識,具體詳情請看下文吧。
瀏覽器開發(fā)者工具
我個人最喜歡Chrome開發(fā)者工具。雖然Safari和Firefox無法達到Chrome那么高的標準,但它們也在逐漸改善。在Firefox中,可以將Firebug和Firefox開發(fā)者工具組合使用。如果Firefox小組在改進內(nèi)置開發(fā)者工具方面繼續(xù)表現(xiàn)優(yōu)異的話,F(xiàn)irebug有一天可能會被淘汰。
先把個人偏好放在一邊,你應(yīng)該能夠在目標瀏覽器中對任意代碼進行試驗和調(diào)試。你的目標瀏覽器可能包括著名的IE8,也可能不包括。
要熟悉你自己選擇的開發(fā)者工具。你還可以從IDE(集成開發(fā)環(huán)境)或者第三方軟件獲得額外的調(diào)試支持。
在各種調(diào)試工具中,調(diào)試的基礎(chǔ)知識是相通的。事實上,我是在90年代從Borland的C開發(fā)者環(huán)境中學習的調(diào)試基礎(chǔ)。斷點、條件斷點、監(jiān)視與最新版Chrome開發(fā)者工具是完全相同的。2000年左右,我在Java中捕獲到第一例異常。堆棧跟蹤(Stack traces)的概念依然適用,即使JavaScript術(shù)語將其稱作錯誤(Error),檢查堆棧跟蹤仍然和以前一樣有用。
有些知識點是前端開發(fā)特有的。例如:
DOM檢查
DOM斷點
調(diào)試事件
內(nèi)存泄露分析
斷點
使用debugger語句可以在源代碼中增加斷點。一旦到達debugger語句,執(zhí)行中斷。當前作用域的上下文出現(xiàn)在控制臺中,還有所有的局部變量和全局變量。將鼠標光標移到變量上可以查看變量的值。
在代碼中還可以創(chuàng)建條件斷點:
JavaScript
if (condition) { debugger; }
還可以根據(jù)自己需要在開發(fā)者工具中插入斷點和條件斷點。在Chrome開發(fā)者工具中,在Sources視圖中點擊行號即可增加斷點。如果在斷點上點擊右鍵并選擇“編輯斷點(Edit Breakpoint)”,你還可以增加斷點條件。
節(jié)點變化的斷點
如果你的任務(wù)是調(diào)試垃圾代碼,你可能會有這樣的問題:為什么DOM節(jié)點在執(zhí)行過程中發(fā)生了改變。Chrome開發(fā)者工具提供了一種方便的斷點,可用來檢測元素樹中的節(jié)點變化。
在Elements視圖中,右鍵點擊一個元素,從右鍵菜單中選擇“Break on…”。
節(jié)點變化的斷點
DOM斷點的類型可能包括:
選定節(jié)點樹狀子目錄(sub-tree)中的節(jié)點變化,
選定節(jié)點的屬性發(fā)生變化,
節(jié)點被刪除。
避免記錄引用類型
當記錄對象或數(shù)組時,原始類型的值在引用對象記錄中可能會發(fā)生變化。當查看引用類型時一定要記住,在記錄和查看期間,代碼執(zhí)行可能會影響觀測到的結(jié)果。
例如,在Chrome開發(fā)者工具中執(zhí)行以下代碼:
JavaScript
var wallets = [{ amount: 0 }]; setInterval( function() { console.log( wallets, wallets[0], wallets[0].amount ); wallets[0].amount += 100; }, 1000 );
記錄的第二個和第三個屬性的值是正確的,第一個屬性中對象引用的值是不可靠的。當你第一次在開發(fā)者工具中顯示這個屬性時,amount域的值就已經(jīng)確定了。無論你對同一個引用關(guān)閉并重新打開多少次,這個值都不會變化。
記錄參考類型
永遠記得你在記錄什么。記錄原始類型時,使用帶斷點的watch表達式。如果是異步代碼,避免記錄引用類型。
表格記錄
在一些開發(fā)者工具中,你可以用console.table在控制臺中記錄對象數(shù)組。
嘗試在你的Chrome開發(fā)者工具中執(zhí)行下列代碼:
JavaScript
console.table( [ { id: 1, name: 'John', address: 'Bay street 1' }, { id: 2, name: 'Jack', address: 'Valley road 2.' }, { id: 3, name: 'Jim', address: 'Hill street 3.' } ] );
輸出是非常好看的表格。所有原始類型都立刻顯示出來,它們的值反應(yīng)記錄時的狀態(tài)。也可以記錄復雜類型,顯示內(nèi)容為其類型,內(nèi)容無法顯示。因此,console.table只能用來顯示具有原始類型值的對象構(gòu)成的二維數(shù)據(jù)結(jié)構(gòu)。
XHR斷點
有時你可能會遇到錯誤的AJAX請求。如果你無法立刻確認提交請求的代碼,XHR斷點可以幫你節(jié)省時間。當提交某一特殊類型的AJAX時,XHR斷點將會終止代碼的執(zhí)行,并將提交請求的代碼段呈現(xiàn)給用戶。
在Chrome開發(fā)者工具的Sources標簽頁中,其中一個斷點類型就是XHR斷點。點擊+圖標,你可以輸入URL片段,當AJAX請求的URL中出現(xiàn)這個URL片段時,JavaScript代碼將會中斷。
事件監(jiān)聽器斷點
Chrome開發(fā)者工具可以捕獲所有類型的事件,當用戶按下一個鍵、點擊一下鼠標時,可以對觸發(fā)的事件進行調(diào)試。
異常時暫停
Chrome開發(fā)者工具可以在拋出異常時暫停執(zhí)行JavaScript代碼。這可以讓你在Error對象被創(chuàng)建時觀察應(yīng)用的狀態(tài)。
異常時暫停
代碼片段
Sources標簽頁左側(cè)面板上有一個代碼片段(Snippet)子標簽頁,可用于保存代碼片段,幫你調(diào)試代碼。
如果你堅持使用控制臺調(diào)試,反復寫相同的代碼,你應(yīng)該將你的代碼抽象成調(diào)試片段。這樣的話,甚至還可以把你的調(diào)試技巧教給你的同事。
Paul Irish發(fā)布過一些基本的調(diào)試代碼片段,例如在函數(shù)執(zhí)行前插入斷點。審查這些代碼片段,并在網(wǎng)上搜索其他代碼片段,這是很有價值的。
在函數(shù)執(zhí)行前插入斷點
如果你可以得到函數(shù)調(diào)用的源代碼,你還可以在函數(shù)調(diào)用前插入斷點來終止函數(shù)的執(zhí)行。如果你想調(diào)試f函數(shù),用debug(f)語句可以增加這種斷點。
Unminify最小化代碼
(譯者注:unminify 解壓縮并進行反混淆)
盡可能使用 source map。有時生產(chǎn)代碼不能使用source map,但不管怎樣,你都 不應(yīng)該直接對生產(chǎn)代碼進行調(diào)試。
(譯者注:sourcemap 是針對壓縮合并后的web代碼進行調(diào)試的工具)
如果沒有source map的話,你最后還可以求助于Chrome開發(fā)者工具Sources標簽頁中的格式化按鈕(Pretty Print Button)。格式化按鈕{}位于源代碼文本區(qū)域的下方。格式化按鈕對源代碼進行美化,并改變行號,這使得調(diào)試代碼更加方便,堆棧跟蹤更加有效。
格式化按鈕只有在不得已時才會使用。從某種意義上來說,丑代碼就是難看,因為代碼中的命名沒有明確的語義。
DOM元素的控制臺書簽
Chrome開發(fā)者工具和Firebug都提供了書簽功能,用于顯示你在元素標簽頁(Chrome)或HTML標簽頁(Firebug)中最后點擊的DOM元素。如果你依次選擇了A元素、B元素和C元素,
$0 表示C元素
$1 表示B元素
$2 表示A元素
如果你又選擇了元素D,那么$0、$1、$2和$3分別代表D、C、B和A。
訪問調(diào)用棧
JavaScript
var f = function() { g(); } var g = function() { h(); } var h = function() { console.trace('trace in h'); } f();
Chrome開發(fā)者工具中的Sources標簽頁也在Watch表達式下面顯示調(diào)用棧。
性能審查
性能審查工具通常是很有用的。這些工具可以用于防止內(nèi)存泄露,還可以檢測到你的網(wǎng)站哪里需要優(yōu)化。由于這些工具并不了解你的產(chǎn)品,你可以忽略其某些建議。通常來說,性能分析工具能夠有效范圍,可以使你的網(wǎng)站顯著優(yōu)化。
審查工具舉例:
Chrome開發(fā)者工具的Audit標簽頁
YSlow
熟能生巧
你可能熟悉某些調(diào)試技巧,其他技巧也會幫你節(jié)省不少時間。如果你開始在實踐中使用這些技巧,我建議你幾周之后重新閱讀本文。你將會驚奇地發(fā)現(xiàn),你的關(guān)注點在幾周內(nèi)就發(fā)生了變化。
五個常用的js調(diào)試工具
JavaScript被稱作以原型(prototype)為基礎(chǔ)的語言。這種語言有很多特色,比如動態(tài)和弱類型,它還有一等函數(shù)(first class function)。另一個特點是它是一個多范型(multi-paradigm)語言,支持面向?qū)ο?、聲明式、函?shù)式的編程風格。
JavaScript最初被用作客戶端語言,瀏覽器實現(xiàn)它用來提供增強的用戶接口。JavaScript在很多現(xiàn)代的網(wǎng)站和Web應(yīng)用程序中都有應(yīng)用。JavaScript的一個很棒的功能也很重要,就是我確實可以用它來提高或改善網(wǎng)站的用戶體驗。JavaScript也可以提供豐富的功能和交互的組件。
JavaScript在這技術(shù)高速發(fā)展的同時變得非常受歡迎。因為受歡迎JavaScript也改進了許多,修改JavaScript腳本有很多事要做。這次我們?yōu)殚_發(fā)者帶來了幾個非常有用的JavaScript調(diào)試工具。
1)Drosera
可以調(diào)試任何WebKit程序,不僅僅是Safari瀏覽器。
2)Dragonfly
源代碼視圖有語法高亮,可以設(shè)置斷點。強大的搜索功能,支持正則表達式。
3)Getfirebug
可以在任何網(wǎng)頁編輯、調(diào)試和實時監(jiān)視CSS、HTML和JavaScript。
4)Debugbar
5)Venkman
Venkman是Mozilla的JavaScript調(diào)試器名稱。它旨在為以Mozilla為基礎(chǔ)的瀏覽器(Firefox, Netscape 7.x/9.x and SeaMonkey)提供一個強大的JavaScript調(diào)試環(huán)境。
以上內(nèi)容是關(guān)于JavaScript如何調(diào)試有哪些建議和技巧及五款常用的調(diào)試工具的相關(guān)說明,希望大家喜歡。
相關(guān)文章
Wordpress ThickBox 添加“查看原圖”效果代碼
上一次修改了點擊圖片動作 , 這次添加一個“查看原圖”的鏈接,點擊后將在一個新瀏覽器窗口(或Tab)打開該圖片的原始鏈接地址。2010-12-12PHP使用方法重載實現(xiàn)動態(tài)創(chuàng)建屬性的get和set方法
這篇文章主要介紹了PHP使用方法重載實現(xiàn)動態(tài)創(chuàng)建屬性的get和set方法,使用本文方法可以在一個類中不用在寫大量的set方法或get方法,需要的朋友可以參考下2014-11-11layer.open關(guān)閉父窗口 以及調(diào)用父頁面的方法
今天小編就為大家分享一篇layer.open關(guān)閉父窗口 以及調(diào)用父頁面的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08javascript使用alert實現(xiàn)一個精美的彈窗
其實最初使用alert還是一個常態(tài),包括現(xiàn)在很多B端平臺還在直接使用alert,本文主要介紹了javascript使用alert實現(xiàn)一個精美的彈窗,感興趣的可以了解一下2023-02-02