前端 JavaScript調(diào)試技巧14個

技術(shù)領(lǐng)域總是充滿著神秘的未知和挑戰(zhàn)餐弱,有趣又令人不能自拔。就像 JavaScript妓柜,即使是每天使用它進(jìn)行開發(fā)交互的開發(fā)人員拌倍,而語言的某些部分仍然未被開發(fā)赂鲤。

了解工具可以使工具最大限度的幫助你完成任務(wù)。盡管JavaScript的調(diào)試非常麻煩柱恤,但在掌握了技巧 (tricks) 的情況下数初,依然可以用盡量少的的時間解決這些錯誤 (errors) 和問題 (bugs) 。

下面小編列出了14個關(guān)于JavaScript的調(diào)試技巧梗顺。雖然調(diào)試技巧也可以用在別的檢查工具上泡孩,但大部分的技巧還是用在 Chrome Inspector 和 Firefox 上的。

1.'debugger'

'debugger'是 console.log 之外最好的調(diào)試工具寺谤,簡單暴力仑鸥。只要把它寫到代碼里吮播,Chrome 運行的時候就會自動自動停在那。甚至可以用條件語句把它包裹起來锈候,這樣就可以在需要的時候才執(zhí)行它。也是一款非常好用的調(diào)試工具了敞贡。

if (thisThing) {
debugger;
}

2.把 objects 輸出成表格

很多時候泵琳,你可能會有一堆對象需要查看√芤郏可以用 console.log 把每一個對象都輸出出來获列,也可以用console.table語句直接把所有對象都直接輸出成一個表格。demo如下:

var animals = [
{ animal: 'Horse', name: 'Henry', age: 43 },
{ animal: 'Dog', name: 'Fred', age: 13 },
{ animal: 'Cat', name: 'Frodo', age: 18 }
];
console.table(animals);

輸出結(jié)果:


image.png

3.試遍所有的尺寸

雖然把各種各樣的手機(jī)都擺在桌子上看起來很酷蛔垢,但卻也不現(xiàn)實击孩。但是,瀏覽器內(nèi)卻提供了你所需要的一切鹏漆。進(jìn)入檢查面板點擊‘切換設(shè)備模式’按鈕巩梢。這樣,就可以在窗口內(nèi)調(diào)整視窗的大小艺玲。

4.如何快速定位 DOM 元素

在元素面板上標(biāo)記一個 DOM 元素并在 console中使用它括蝠。Chrome Inspector的歷史記錄保存最近的五個元素,最后被標(biāo)記的元素為0饭聚,倒數(shù)第二個被標(biāo)記的為1,以此類推忌警。

image.png

5.用 console.time()和console.timeEnd()測試循環(huán)耗時

當(dāng)你想知道某些代碼的執(zhí)行時間的時候這個工具將會非常有用,特別是當(dāng)你定位很耗時的循環(huán)的時候秒梳。你是指可以通過標(biāo)簽開設(shè)置多個 timer法绵。demo 如下:

console.time('Timer1');
var items = [];
for(var i = 0; i < 100000; i++){
items.push({index: i});
}
console.timeEnd('Timer1');

運行結(jié)果:


image.png

6.獲取函數(shù)的堆棧軌跡信息

在使用JavaScript框架的時候會產(chǎn)生很多的代碼。
它創(chuàng)建視圖觸發(fā)事件而且最終會想知道函數(shù)調(diào)用是怎么發(fā)生的酪碘。
因為 JavaScript 不是一個很結(jié)構(gòu)化的語言朋譬,有時候很難完整的了解到底發(fā)生了什么以及什么時候發(fā)生的。 這個時候就輪到 console.trace(在終端的話就只有 trace )出場來調(diào)試 JavaScript了 兴垦。

7.格式化代碼使調(diào)試 JavaScript 變得容易

有時候你發(fā)現(xiàn)產(chǎn)品有一個問題此熬,而 source map 并沒有部署到服務(wù)器。不要害怕滑进。Chrome 可以格式化 JavaScript 文件犀忱,使之易讀。格式化出來的代碼在可讀性上可能不如源代碼 —— 但至少你可以觀察到發(fā)生的錯誤扶关。點擊源代碼查看器下面的美化代碼按鈕 {} 即可阴汇。

image.png

8.快速找到調(diào)試函數(shù)

我們來看看怎么在函數(shù)中設(shè)置斷點。

通常情況下有兩種方法:

  1. 在查看器中找到某行代碼并在此添加斷點
  2. 在腳本中添加 debugger
    這兩種方法都必須在文件中找到需要調(diào)試的那一行节槐。

使用控制臺是不太常見的方法搀庶。在控制臺中使用 debug(funcName)拐纱,代碼會在停止在進(jìn)入這里指定的函數(shù)時。

這個操作很快哥倔,但它不能用于局部函數(shù)或匿名函數(shù)秸架。不過如果不是這兩種情況下,這可能是調(diào)試函數(shù)最快的方法咆蒿。(注意:這里并不是在調(diào)用 console.debug 函數(shù))东抹。

var func1 = function() {
func2();
};
var Car = function() {
this.funcX = function() {
this.funcY();
}
this.funcY = function() {
this.funcZ();
}
}
var car = new Car();

在控制臺中輸入 debug(car.funcY),腳本會在調(diào)試模式下沃测,進(jìn)入 car.funcY 的時候停止運行:


image.png

9.屏蔽不相關(guān)代碼

如今缭黔,經(jīng)常在應(yīng)用中引入多個庫或框架。其中大多數(shù)都經(jīng)過良好的測試且相對沒有缺陷蒂破。但是馏谨,調(diào)試器仍然會進(jìn)入與此調(diào)試任務(wù)無關(guān)的文件。解決方案是將不需要調(diào)試的腳本屏蔽掉附迷。當(dāng)然這也可以包括你自己的腳本惧互。 點此閱讀更多關(guān)于調(diào)試不相關(guān)代碼(http://raygun.com/blog/javascript-debugging-with-black-box/)。

10. 在復(fù)雜的調(diào)試過程中尋找重點

在更復(fù)雜的調(diào)試中喇伯,我們有時需要輸出很多行壹哺。你可以做的事情就是保持良好的輸出結(jié)構(gòu),使用更多控制臺函數(shù)艘刚,例如 console.log管宵,console.debug,console.warn攀甚,console.info箩朴,console.error 等等。然后秋度,你可以在控制臺中快速瀏覽炸庞。但有時候,某些JavaScrip調(diào)試信息并不是你需要的荚斯。

現(xiàn)在埠居,可以自己美化調(diào)試信息了。在調(diào)試JavaScript時事期,可以使用CSS并自定義控制臺信息:

console.todo = function(msg) {
console.log(‘ % c % s % s % s‘, ‘color: yellow; background - color: black;’, ‘–‘, msg, ‘–‘);
}
console.important = function(msg) {
console.log(‘ % c % s % s % s’, ‘color: brown; font - weight: bold; text - decoration: underline;’, ‘–‘, msg, ‘–‘);
}
console.todo(“This is something that’ s need to be fixed”);
console.important(‘This is an important message’);

輸出:

image.png

例如:
在console.log()中滥壕, 可以用%s設(shè)置字符串,%i設(shè)置數(shù)字兽泣,%c設(shè)置自定義樣式等等绎橘,還有很多更好的console.log()使用方法。 如果使用的是單頁應(yīng)用框架唠倦,可以為視圖(view)消息創(chuàng)建一個樣式称鳞,為模型(models)涮较,集合(collections),控制器(controllers)等創(chuàng)建另一個樣式冈止。也許還可以像 wlog狂票,clog 和 mlog 一樣發(fā)揮小伙伴們的想象力!

11. 查看具體的函數(shù)調(diào)用和它的參數(shù)

在 Chrome 瀏覽器的控制臺(Console)中熙暴,大家的注意力都集中在具體的函數(shù)上闺属。每次這個函數(shù)被調(diào)用,它的值就會被記錄下來怨咪。

var func1 = function(x, y, z) {
//....
};

然后輸出:


image.png

12.在控制臺中快速訪問元素

在控制臺中執(zhí)行 querySelector 一種更快的方法是使用美元符屋剑。$(‘css-selector’) 將會返回第一個匹配的 CSS 選擇器润匙。$$(‘css-selector’) 將會返回所有诗眨。如果你使用一個元素超過一次,它就值得被作為一個變量孕讳。


image.png

13. Postman 很棒(但 Firefox 更快)

很多開發(fā)人員都使用 Postman 來處理 Ajax 請求匠楚。Postman 真不錯,但每次都需要打開新的瀏覽器窗口厂财,新寫一個請求對象來測試芋簿。這確實有點兒煩人。
有時候直接使用在用的瀏覽器會更容易璃饱。
這樣的話与斤,如果你想請求一個通過密碼保證安全的頁面時,就不再需要擔(dān)心驗證 Cookie 的問題荚恶。這就是 Firefox 中編輯并重新發(fā)送請求的方式撩穿。
打開探查器并進(jìn)入網(wǎng)絡(luò)頁面,右鍵單擊要處理的請求谒撼,選擇編輯并重新發(fā)送∈彻眩現(xiàn)在你想怎么改就怎么改±保可以修改頭信息抵皱,也可以編輯參數(shù),然后點擊重新發(fā)送即可辩蛋。
現(xiàn)在我發(fā)送了兩次同一個請求呻畸,但使用了不同的參數(shù):


image.png

14.節(jié)點變化時中斷

DOM 是個有趣的東西。有時候它發(fā)生了變化悼院,但你卻并不知道為什么會這樣擂错。不過,如果你需要調(diào)試 JavaScript樱蛤,Chrome 可以在 DOM 元素發(fā)生變化的時候暫停處理钮呀。你甚至可以監(jiān)控它的屬性剑鞍。在 Chrome 探查器上,右鍵點擊某個元素爽醋,并選擇中斷(Break on)選項來使用:


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚁署,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚂四,更是在濱河造成了極大的恐慌光戈,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遂赠,死亡現(xiàn)場離奇詭異久妆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)跷睦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門筷弦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抑诸,你說我怎么就攤上這事烂琴。” “怎么了蜕乡?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵奸绷,是天一觀的道長。 經(jīng)常有香客問我层玲,道長号醉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任辛块,我火速辦了婚禮畔派,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘憨降。我一直安慰自己父虑,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布授药。 她就那樣靜靜地躺著士嚎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪悔叽。 梳的紋絲不亂的頭發(fā)上莱衩,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音娇澎,去河邊找鬼笨蚁。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的括细。 我是一名探鬼主播伪很,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奋单!你這毒婦竟也來了锉试?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤览濒,失蹤者是張志新(化名)和其女友劉穎呆盖,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贷笛,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡应又,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了乏苦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片株扛。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖邑贴,靈堂內(nèi)的尸體忽然破棺而出席里,到底是詐尸還是另有隱情叔磷,我是刑警寧澤拢驾,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站改基,受9級特大地震影響繁疤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秕狰,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一稠腊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸣哀,春花似錦架忌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挠羔,卻和暖如春井仰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背破加。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工俱恶, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓合是,卻偏偏與公主長得像了罪,于是被迫代替她去往敵國和親工坊。 傳聞我的和親對象是個殘疾皇子内颗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容