Chrome 瀏覽器 Javascript 調(diào)試參考

此文章翻譯自developers.google.com/web/tools/chrome-devtools/javascript/reference芭届,是對(duì) chrome 下調(diào)試 javascript 的工具和方法介紹谍憔。

調(diào)試 js 需要結(jié)合瀏覽器斷點(diǎn)操作徙融,具體可見(jiàn)我的上一篇文章:?使用斷點(diǎn)調(diào)試代碼示罗。



打上斷點(diǎn)之后龙亲,需要操作對(duì)應(yīng)圖標(biāo)進(jìn)行調(diào)試锨阿,圖標(biāo)如下:


從左到右分別是:

Pause/Resume script execution:暫停/恢復(fù)腳本執(zhí)行(程序執(zhí)行到下一斷點(diǎn)停止)树碱。

Step over next function call:執(zhí)行到下一步的函數(shù)調(diào)用(執(zhí)行當(dāng)前斷點(diǎn)所在行,跳到下一行)踩验。

Step into next function call:進(jìn)入當(dāng)前函數(shù)鸥诽。

Step out of current function:跳出當(dāng)前執(zhí)行函數(shù)。

Deactive/Active all breakpoints:關(guān)閉/開(kāi)啟所有斷點(diǎn)(不會(huì)取消)箕憾。

Pause on exceptions:異常情況自動(dòng)斷點(diǎn)設(shè)置牡借。



Pause/Resume script execution( F8)

在斷點(diǎn)暫停后,點(diǎn)擊恢復(fù)腳本執(zhí)行袭异,直到下一個(gè)斷點(diǎn)為止钠龙。

長(zhǎng)按圖標(biāo),會(huì)出現(xiàn)灰色的播放按鈕,鼠標(biāo)移上去再松開(kāi)左鍵碴里,會(huì)忽略所有的斷點(diǎn)沈矿,強(qiáng)制渲染完整的頁(yè)面。



Step over next function call (F10)

當(dāng)在一行代碼中暫停咬腋,代碼里包含一個(gè)與正在調(diào)試的問(wèn)題無(wú)關(guān)的函數(shù)時(shí)羹膳,可以點(diǎn)擊此圖標(biāo)直接解析該函數(shù),而不是進(jìn)入函數(shù)內(nèi)部逐行執(zhí)行debug操作根竿。

例如陵像,當(dāng)你在 debug 以下代碼:

function updateHeader() {

????var day = new Date().getDay();

????var name = getName(); // A

????updateName(name); // D

}

function getName() {

var name = app.first + ' ' + app.last; // B

return name; // C

}

假設(shè)現(xiàn)在是在 A 處暫停。點(diǎn)擊 '跳過(guò)下個(gè)函數(shù)調(diào)用' 圖標(biāo)寇壳,瀏覽器會(huì)解析被跳過(guò)的函數(shù)里的所有代碼(這里是 B 和 C)醒颖,然后在 D 處再次暫停。



Step into next function call?( F11)

當(dāng)斷點(diǎn)找到了要 debug 的確切函數(shù)壳炎,點(diǎn)擊圖標(biāo)進(jìn)入此函數(shù)內(nèi)部泞歉,逐行查看分析里面的變量值和方法。

例如:

function updateHeader() {

????var day = new Date().getDay();

????var name = getName(); // A

????updateName(name); // D

};

function getName() {

????var name = app.first + ' ' + app.last; // B

????return name; // C

}

此時(shí)在 A 處打點(diǎn)暫停了匿辩,而 A 處就是與問(wèn)題相關(guān)的函數(shù)腰耙,點(diǎn)擊進(jìn)入函數(shù)里,會(huì)在 B 處暫停撒汉,再次點(diǎn)擊會(huì)在 C 處暫停沟优,同時(shí) B 處會(huì)顯示 'name' 變量的值。



Step out of current function (Shift + F8)

進(jìn)入到一個(gè)與正在 debug 的問(wèn)題無(wú)關(guān)的函數(shù)后睬辐,可以點(diǎn)擊此圖標(biāo)解析函數(shù)剩下的代碼挠阁,跳出函數(shù)到下一行。

例如:

function updateHeader() {

var day = new Date().getDay();

????var name = getName(); // A

????updateName(name); // D

};

function getName() {

????var name = app.first + ' ' + app.last; // B

????return name; // C

}

現(xiàn)在在 B 處暫停溯饵,step out 之后侵俗,瀏覽器解析 getName() 函數(shù)剩下的代碼(C),然后在 D 處再次暫停丰刊。



Run all code up to a certain line

如果你在 debug 一個(gè)很長(zhǎng)的函數(shù)隘谣,里面包含了很多與問(wèn)題無(wú)關(guān)的代碼,需要區(qū)分出來(lái)啄巧。

首先在函數(shù)里設(shè)置第一個(gè)斷點(diǎn)寻歧,執(zhí)行至?xí)和#缓笾绕停腥N方法 debug :

? ? 1码泛、使用 step into function 逐行解析查看結(jié)果,會(huì)浪費(fèi)不少時(shí)間澄耍;

? ? 2噪珊、根據(jù)結(jié)果判斷哪些是無(wú)用的代碼晌缘,越過(guò)它們?cè)僭O(shè)置下一個(gè)斷點(diǎn),使用 resume script 執(zhí)行到下一個(gè)斷點(diǎn)痢站;

? ? 3磷箕、根據(jù)結(jié)果判斷哪些是無(wú)用的代碼,在下一個(gè)需要暫停的地方阵难,右鍵行數(shù)岳枷,選擇 “continue to here”,瀏覽器會(huì)直接解析到那一行并暫停呜叫,推薦的方法嫩舟。



View the current call stack

在一行代碼里暫停時(shí),可以在 Call Stack 面板查看是哪些棧將你帶到了當(dāng)前斷點(diǎn)(到達(dá)當(dāng)前函數(shù)調(diào)用了哪些函數(shù))怀偷。如果不是在一行代碼里暫停, Call Stack 面板是沒(méi)有內(nèi)容的播玖。

如果要查看異步函數(shù)椎工,可以勾選 Async 。(在 windows 版本中沒(méi)有此選項(xiàng)蜀踏,默認(rèn)顯示異步函數(shù))维蒙。

點(diǎn)擊函數(shù)會(huì)跳到此函數(shù)調(diào)用的地方。藍(lán)色箭頭是當(dāng)前查看的函數(shù)果覆。




Copy stack trace

在 Call Stack 面板里右鍵颅痊,選擇?Copy stack trace 可以將面板里的 stack 信息復(fù)制到 clipboard。


復(fù)制的信息格式如下(函數(shù)名稱局待、在代碼里的行數(shù)):

getNumber1(get-started.js:35)

inputsAreEmpty(get-started.js:22)

onClick(get-started.js:15)


Restart the top function of the call stack

在調(diào)試函數(shù)的過(guò)程中斑响,想回到函數(shù)的開(kāi)頭重新 debug 的時(shí)候,可以在 Call Stack 面板中對(duì)應(yīng)的函數(shù)上右鍵钳榨,選擇?Restart Frame 而無(wú)需在開(kāi)頭打斷點(diǎn)舰罚。Call Stack 面板里是斷點(diǎn)函數(shù)以及所涉及到的其他函數(shù),最頂端的函數(shù)是當(dāng)前的斷點(diǎn)函數(shù)薛耻。

例如:

function factorial(n) {

????var product = 0; // B

????for (var i = 1; i <= n; i++) {

????product += i;

};

return product; // A

}

現(xiàn)在在 A 處暫停营罢,點(diǎn)擊 Restart Frame 之后,會(huì)在 B 處暫停饼齿。





Ignore a script or pattern of scripts

在 debug 過(guò)程中饲漾,可以選擇忽略部分腳本,不在 Call Stack 中顯示缕溉,在 step into function 的時(shí)候也不會(huì)進(jìn)入被忽略的腳本考传。

例如:

function animate() {

????prepare();

????lib.doFancyStuff(); // A

????render();

}

A 是你確認(rèn)與當(dāng)前問(wèn)題無(wú)關(guān)的第三方庫(kù),那就可以將它關(guān)入黑盒子里忽略掉倒淫。

在編輯區(qū)操作: 在 Source Tab 中雙擊打開(kāi)文件 -> 在文件編輯區(qū)右鍵伙菊,選擇?Blackbox script 败玉。


在Call Stack 面板操作: 在 Call Stack 面板中找到對(duì)應(yīng)的腳本 -> 右鍵選擇?Blackbox script 。


在控制臺(tái)設(shè)置黑盒: 控制臺(tái)右上角找到 'Customize and control DevTools' 圖標(biāo)(或按F1) -> 選擇?Blackboxing?tab -> 點(diǎn)擊?Add pattern ->??在對(duì)話框中輸入腳本名字或腳本名字的正則表達(dá)式 -> 點(diǎn)擊 Add镜硕。



Change thread context

在網(wǎng)站有 web workers 或者 service workers 線程的時(shí)候运翼,需要分別查看主線程和這兩個(gè)線程的 context ,可以在 Threads 面板切換兴枯。


上圖藍(lán)色箭頭處是當(dāng)前線程的 context 血淌, 可以點(diǎn)擊切換其他線程。



View and edit local, closure, and global properties

在斷點(diǎn)暫停時(shí)财剖,可以在 Scope 面板里查看和編輯局部悠夯、閉包和全局范圍內(nèi)的屬性和變量的值。不會(huì)顯示不可枚舉的屬性躺坟。

雙擊一個(gè)屬性值可以輸入新的值沦补。




Run snippets of debug code from any page

如果在調(diào)試中,需要一次次在控制臺(tái)輸入相同的內(nèi)容的話咪橙,可以使用?Snippets(代碼片段) 功能減少重復(fù)勞動(dòng)夕膀。代碼片段是您在DevTools中編寫(xiě)、存儲(chǔ)和運(yùn)行的可執(zhí)行腳本美侦。

Snippets 是全局的产舞,在瀏覽器的所有標(biāo)簽頁(yè)都能找到和運(yùn)行。

具體可查看?從任何頁(yè)面運(yùn)行代碼片段



Watch the values of custom JavaScript expressions

在 debug 過(guò)程中菠剩,如果希望重點(diǎn)觀察某些變量的值(而不是在 Scope 面板里層層點(diǎn)開(kāi))易猫,可以加入 Watch 面板。Watch 面板里的值會(huì)在執(zhí)行代碼時(shí)自動(dòng)刷新具壮。


'+' 圖標(biāo)創(chuàng)建新的 expression准颓;右邊是刷新圖標(biāo),手動(dòng)刷新變量的值嘴办;鼠標(biāo)移動(dòng)到變量上瞬场,在右側(cè)會(huì)出現(xiàn)刪除圖標(biāo)。



Make a minified file readable

可以將最小化了的代碼還原成對(duì)人友好的形式涧郊。

點(diǎn)擊代碼編輯區(qū)域左下角的 '{}' 圖標(biāo)贯被。




Edit a script

如果要嘗試修復(fù) bug , 不需要切換到編輯器修改妆艘,再刷新當(dāng)前頁(yè)面彤灶。你可以直接在代碼編輯區(qū)域修改代碼然后保存看看修改后的效果。如果是最小化了的代碼批旺,可以先還原成對(duì)人友好的格式幌陕。

操作: 修改代碼 -> 按 Command + S (mac)或 Ctrl + S (windows, Linux)保存修改 -> 查看效果。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汽煮,一起剝皮案震驚了整個(gè)濱河市搏熄,隨后出現(xiàn)的幾起案子棚唆,更是在濱河造成了極大的恐慌,老刑警劉巖心例,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宵凌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡止后,警方通過(guò)查閱死者的電腦和手機(jī)瞎惫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)译株,“玉大人瓜喇,你說(shuō)我怎么就攤上這事∏该樱” “怎么了乘寒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)匪补。 經(jīng)常有香客問(wèn)我肃续,道長(zhǎng),這世上最難降的妖魔是什么叉袍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮刽酱,結(jié)果婚禮上喳逛,老公的妹妹穿的比我還像新娘。我一直安慰自己棵里,他們只是感情好润文,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著殿怜,像睡著了一般典蝌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上头谜,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天骏掀,我揣著相機(jī)與錄音,去河邊找鬼柱告。 笑死截驮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的际度。 我是一名探鬼主播葵袭,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼乖菱!你這毒婦竟也來(lái)了坡锡?” 一聲冷哼從身側(cè)響起蓬网,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鹉勒,沒(méi)想到半個(gè)月后帆锋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贸弥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年窟坐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绵疲。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哲鸳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盔憨,到底是詐尸還是另有隱情徙菠,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布郁岩,位于F島的核電站婿奔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏问慎。R本人自食惡果不足惜萍摊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望如叼。 院中可真熱鬧冰木,春花似錦、人聲如沸笼恰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)社证。三九已至逼龟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間追葡,已是汗流浹背腺律。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宜肉,地道東北人疾渣。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像崖飘,于是被迫代替她去往敵國(guó)和親榴捡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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

  • 前言 相信無(wú)論是對(duì)于身居一線的coder,還是退居多年的老司機(jī)managers來(lái)說(shuō),對(duì)于調(diào)試程序是不陌生的,對(duì)于w...
    itclanCoder閱讀 2,574評(píng)論 0 7
  • 單例模式 適用場(chǎng)景:可能會(huì)在場(chǎng)景中使用到對(duì)象朱浴,但只有一個(gè)實(shí)例吊圾,加載時(shí)并不主動(dòng)創(chuàng)建达椰,需要時(shí)才創(chuàng)建 最常見(jiàn)的單例模式,...
    Obeing閱讀 2,065評(píng)論 1 10
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評(píng)論 25 707
  • 我有很久沒(méi)玩賽車(chē)游戲了项乒,手機(jī)隨意看了蘋(píng)果手機(jī)的APP,看了介紹被它炫酷的感覺(jué)所吸引啰劲。 每個(gè)跑道都不同,不禁帶給你飛...
    cca8645a5515閱讀 374評(píng)論 0 0
  • 農(nóng)歷九月初二 今天早晨開(kāi)始下雨 上午雨很大 午后停雨后還出了陣太陽(yáng) 晚上我們一起吃了營(yíng)養(yǎng)米線 還吃了雪糕 看了一部...
    大眼瞪閱讀 354評(píng)論 2 0