JS 斷點(diǎn)調(diào)試心得

1.斷點(diǎn)調(diào)試是啥兑徘?難不難?

斷點(diǎn)調(diào)試其實(shí)并不是多么復(fù)雜的一件事徐鹤,簡單的理解無外呼就是打開瀏覽器失暴,打開sources找到j(luò)s文件,在行號上點(diǎn)一下罷了棕洋。操作起來似乎很簡單挡闰,其實(shí)很多人糾結(jié)的是,是在哪里打斷點(diǎn)掰盘?(我們先看一個斷點(diǎn)截圖摄悯,以chrome瀏覽器的斷點(diǎn)為例)

image

步驟記住沒?

用chrome瀏覽器打開頁面 → 按f12打開開發(fā)者工具 → 打開Sources → 打開你要調(diào)試的js代碼文件 → 在行號上單擊一下愧捕,OK!恭喜你的處女?dāng)帱c(diǎn)打上了,哈哈~~

2.斷點(diǎn)怎么打才合適奢驯?

打斷點(diǎn)操作很簡單,核心的問題在于次绘,斷點(diǎn)怎么打才能夠排查出代碼的問題所在呢瘪阁?下面我繼續(xù)舉個例子方便大家理解撒遣,廢話不多說,上圖:

image

假設(shè)我們現(xiàn)在正在實(shí)現(xiàn)一個加載更多的功能管跺,如上圖义黎,但是現(xiàn)在加載更多功能出現(xiàn)了問題,點(diǎn)擊以后數(shù)據(jù)沒有加載出來伙菜,這時候我們第一時間想到的應(yīng)該是啥轩缤?(換一行寫答案,大家可以看看自己的第一反應(yīng)是啥)

我最先想到的是贩绕,我點(diǎn)擊到底有沒有成功火的?點(diǎn)擊事件里的方法有沒有運(yùn)行?好淑倾,要想知道這個問題的答案馏鹤,我們立馬去打個斷點(diǎn)試試看,斷點(diǎn)打在哪娇哆?自己先琢磨一下湃累。

接著上圖:

image

各位想到?jīng)]?沒錯碍讨,既然想知道點(diǎn)擊是否成功治力,我們當(dāng)然是在代碼中的點(diǎn)擊事件處添加一個斷點(diǎn),切記不要添加在226行哦勃黍,因?yàn)楸粓?zhí)行的是click方法內(nèi)的函數(shù)宵统,而不是226行的選擇器。斷點(diǎn)現(xiàn)在已經(jīng)打上了覆获,然后做什么呢马澈?自己再琢磨琢磨~

繼續(xù)上圖:

image

然后我們當(dāng)然是回去點(diǎn)擊加載更多按鈕啦,為什么弄息?額痊班。。摹量。如果你這么問涤伐,請允許我用這個表情
image

,不點(diǎn)擊加載更多按鈕缨称,怎么去觸發(fā)點(diǎn)擊事件废亭?不觸發(fā)點(diǎn)擊事件,怎么去執(zhí)行點(diǎn)擊事件里的函數(shù)具钥?咆哮狀。液兽。不過我相信大家肯定不會問這么low的問題不瞎扯了

繼續(xù)正題骂删,上面的圖就是點(diǎn)擊加載更多按鈕后的情況掌动,我們可以看到左側(cè)的頁面被一個半透明的層給蓋住了,頁面上方還有一串英文和兩個按鈕宁玫,右側(cè)代碼227行被添加上了背景色粗恢,出現(xiàn)這個情況,先不管那些按鈕英文是啥意思有啥作用欧瘪,你從這個圖得到了什么信息眷射?繼續(xù)琢磨琢磨~

如果出現(xiàn)了上圖這個情況,說明一點(diǎn)佛掖,click事件中的函數(shù)被調(diào)用了妖碉,進(jìn)一步說明了點(diǎn)擊事件生效。那么我們對于這個問題產(chǎn)生的第一個“犯罪嫌疑人”就被排除了芥被。

補(bǔ)充一下:

如果沒有出現(xiàn)上面的情況咋辦欧宜?那是不是說明點(diǎn)擊事件沒有生效呢?那是什么導(dǎo)致點(diǎn)擊事件沒有生效拴魄?大家自己思考思考~

可能導(dǎo)致點(diǎn)擊事件沒生效的原因很多冗茸,比多選擇器錯誤,語法錯誤匹中,被選擇的元素是后生成的等夏漱。怎么解決呢?

選擇器錯誤顶捷,大家可以繼續(xù)往后看到console部分的內(nèi)容挂绰,我想大家就知道怎么處理了

語法錯誤,細(xì)心排查一下焊切,不熟悉的語法可以百度對比一下

被選擇的元素是后生成的扮授,最簡單的處理就是使用.on()方法去處理,這個東東帶有事件委托處理专肪,詳情可以自行百度刹勃。

那么接下來”犯罪嫌疑人“的身份鎖定在哪里呢?

我們將目光投向事件內(nèi)部嚎尤,click事件觸發(fā)了荔仁,那么接下來的問題就是它內(nèi)部的函數(shù)問題了。如果你要問為什么芽死?請給我一塊豆腐乏梁。。关贵。

打個比方遇骑,給你一支筆,讓你寫字揖曾,然后你在紙上寫了一個字落萎,發(fā)現(xiàn)字沒出來亥啦,為啥?你說我寫了呀练链,紙上都還有劃痕翔脱。那是不是可能筆沒有墨水或者筆尖壞了了?這個例子和點(diǎn)擊加載更多一個道理媒鼓,寫字這個動作就是點(diǎn)擊操作届吁,而內(nèi)部函數(shù)就是墨水或者筆尖。明白了不~

接著我們分析下點(diǎn)擊事件里面的內(nèi)容绿鸣,里面包含三句話疚沐,第一句話是變量i自增長,第二句話是給按鈕添加一個i標(biāo)簽枚驻,第三句話是調(diào)用請求數(shù)據(jù)的方法濒旦。

就通過這三句話的本身作用,我們可以將較大一部分嫌疑放在第三句話再登,一小部分放在第一句和第二句話上尔邓,有人可能會疑惑,第二句話怎么會有嫌疑呢锉矢?他的作用只不過是添加一個標(biāo)簽梯嗽,對于數(shù)據(jù)完全沒有影響啊,確實(shí)沽损,這句話對于數(shù)據(jù)沒有影響灯节,但是出于嚴(yán)謹(jǐn)考慮,它仍然有可能出錯绵估,例如它要是少了一個分號呢炎疆?或者句子內(nèi)部某個符號錯誤呢?往往就是這種小問題浪費(fèi)我們很多時間国裳。

好形入,為了進(jìn)一步鎖定”犯罪嫌疑人“,給大家介紹一個工具缝左,也是上圖出現(xiàn)兩個圖標(biāo)之一亿遂,見下圖:

image

這個小圖標(biāo)的功能叫”逐語句執(zhí)行“或者叫”逐步執(zhí)行“,這是我個人理解的一個叫法渺杉,意思就是蛇数,每點(diǎn)擊它一次,js語句就會往后執(zhí)行一句是越,它還有一個快捷鍵耳舅,F(xiàn)10。下圖示范一下它被點(diǎn)擊以后的效果:

image

我單擊了兩次這個按鈕(或者使用F10快捷鍵)倚评,js代碼從227行執(zhí)行到了229行挽放,所以我管它叫”逐語句執(zhí)行“或者”逐步執(zhí)行“绍赛。這個功能非常的實(shí)用,大部分的調(diào)試都會使用到它辑畦。

上面介紹到我單擊了兩次“逐語句執(zhí)行”按鈕,代碼從227行運(yùn)行到229行腿倚,大家覺得這意味著啥纯出?是不是說明從語法上來說,前兩句是沒有問題的敷燎,那么是不是也同時意味著前兩句就排除嫌疑了呢暂筝?我看不然。

大家都知道硬贯,加載更多就是一個下一頁的功能焕襟,而其中最核心的一個就是傳給后臺的頁碼數(shù)值,每當(dāng)我點(diǎn)擊加載更多按鈕一次饭豹,頁碼的數(shù)值就要加1鸵赖,所以如果下一頁的數(shù)據(jù)沒出來,是不是有可能是因?yàn)轫摯a數(shù)值也就是[i變量](下面統(tǒng)一稱呼i)有問題拄衰?那么如何排查頁碼是否存在問題呢它褪?大家自己先思考思考。

下面教大家兩種查看頁碼數(shù)值i]實(shí)際輸出值的方法翘悉,上圖:

第一種:

image

操作步驟如下:

1.仍然是在227行打上斷點(diǎn) → 2. 點(diǎn)擊加載更多按鈕 → 3. 單擊一次“逐語句執(zhí)行“按鈕茫打,js代碼執(zhí)行到228行 → 4.用鼠標(biāo)選中i++(什么叫選中大家里不理解?就是你要復(fù)制一個東西妖混,是不是要選中它老赤?對,就是這個選中) → 5. 選中以后制市,鼠標(biāo)懸浮在目標(biāo)上方抬旺,你就看到上圖的結(jié)果。

第二種:

image

這個方法其實(shí)和第一種差不多息堂,只不過是在控制臺輸出i的值嚷狞,大家只需要按照第一種方法執(zhí)行到第三步 → 4. 打開和sources同一級欄目的console → 5. 在console下方的輸入欄里輸入i → 6. 按enter回車鍵即可。

上面的第二種方法里荣堰,提到了console這個東西床未,我們可以稱呼它為控制臺或者其他什么都可以,這不重要~console的功能很強(qiáng)大振坚,在調(diào)試的過程中薇搁,我們往往需要知道某些變量的值到底輸出了什么,或者我們使用選擇器[$”.div”)這種]是否選中了我們想要的元素等渡八,都可以在控制臺打印出來啃洋。當(dāng)然直接用第一種方法也可以传货。

給大家示范一下在console里打印我們想要選中的元素。上圖~

image

在控制臺中輸入$(this)宏娄,即可得到選擇的元素问裕,沒錯,正是我們所點(diǎn)擊的對象——加載更多按鈕元素孵坚。

在這里給大家說說我對console這個控制臺的理解:這個東東就是一個js解析器粮宛,是瀏覽器本身用來解析運(yùn)行js的家伙,只不過瀏覽器通過console讓我們開發(fā)者在調(diào)試過程中卖宠,可以控制js的運(yùn)行以及輸出巍杈。通過上面的兩種方法,大家可能覺得使用起來很簡單扛伍,但是我要給大家提醒一下筷畦,或者說是一些新手比較容易遇到的困惑。

困惑一:在沒有打斷點(diǎn)的情況下刺洒,在console輸入i鳖宾,結(jié)果console報錯了。

這應(yīng)該是新手很常見的問題作媚,為什么不打斷點(diǎn)我就沒有辦法在控制臺直接輸出變量的值呢攘滩?個人理解這時候i只是一個局部變量,如果不打上斷點(diǎn)纸泡,瀏覽器會把所有的js全部解析完成漂问,console并不能訪問到局部變量,只能訪問到全局變量女揭,所以這時候console會報錯i未定義蚤假,但是當(dāng)js打上斷點(diǎn)時,console解析到了局部變量i所在的函數(shù)內(nèi)吧兔,這時候i是能夠被訪問的磷仰。

困惑二:為什么我直接在console里輸入$(“.xxx”)能打印出東西來呢?

很簡單境蔼,console本身就是一個js解析器灶平,$(“.xxx”)就是一個js語句,所以自然console能夠解析這個語句然后輸出結(jié)果箍土。

介紹完“逐語句執(zhí)行”按鈕和console控制臺的用法逢享,最后再介紹一個按鈕,上圖:

image

這個按鈕我稱呼它為“逐過程執(zhí)行”按鈕吴藻,和“逐語句執(zhí)行”按鈕不同瞒爬,“逐過程執(zhí)行”按鈕常用在一個方法調(diào)用多個js文件時,涉及到的js代碼比較長,則會使用到這個按鈕侧但。

上圖:

image

假設(shè)上圖我只在227行打了個斷點(diǎn)矢空,然后一直點(diǎn)擊逐語句執(zhí)行”按鈕到229行,這時候如果再點(diǎn)擊一次“逐語句執(zhí)行”按鈕呢禀横?則會進(jìn)入下圖的js里:

image

這些都是zepto庫文件的內(nèi)容屁药,沒啥好看的,里面運(yùn)行很復(fù)雜燕侠,我們不可能一直使用“逐語句執(zhí)行”按鈕者祖,這樣你會發(fā)現(xiàn)你按了大半天還在庫文件里面繞。绢彤。。這時候咋辦蜓耻?那就該“逐過程執(zhí)行”按鈕上場了茫舶。

上圖:

image

我除了在227行打了一個斷點(diǎn),同時還在237行打了一個斷點(diǎn)刹淌,當(dāng)我們運(yùn)行到229行時饶氏,直接單擊“逐過程執(zhí)行”按鈕,你會發(fā)現(xiàn)有勾,js直接跳過了庫文件疹启,運(yùn)行到了237行,大家可以自己使用體驗(yàn)一下蔼卡。

最后總結(jié):

本文主要介紹了“逐語句執(zhí)行”按鈕喊崖、“逐過程執(zhí)行”按鈕、console控制臺這三個工具雇逞,以及調(diào)試bug時的一些思路荤懂。工具的用法我就不再贅述了,大家知道用法就行塘砸,具體怎么去更合理的使用节仿,還需要大家通過大量的實(shí)踐去總結(jié)提升~

我其實(shí)在本文主要想講的是調(diào)試bug的一個思路,但是由于選的例子涉及東西太多掉蔬。廊宪。。怕全部寫下來內(nèi)容太長女轿,大家也沒興趣看箭启,所以我就簡單的選了一部分給大家講解,不知道大家有沒有收獲谈喳。別看我調(diào)試三句話寫了一堆的東西册烈,如果真的在實(shí)際項(xiàng)目中你也像我這樣去做,估計你調(diào)試一個Bug的時間會比寫一個腳本的時間還長很多。赏僧。大猛。在實(shí)際情況下,我們應(yīng)該養(yǎng)成拿到問題的第一時間淀零,自行在腦海中排查問題挽绩,找到最有可能出現(xiàn)問題的點(diǎn),如果沒辦法迅速的排查出最重要的點(diǎn)驾中,那么你可以使用最麻煩但是很靠譜的方法唉堪,利用“逐語句執(zhí)行”按鈕將整個和問題相關(guān)的js依次去執(zhí)行一遍,在執(zhí)行的過程中肩民,自己也跟著理清思路唠亚,同時注意下每個變量的值以及選擇器選中的元素是否正確,一般來說持痰,這樣做一遍下來灶搜,bug都解決的差不多了。

所以個人認(rèn)為工窍,我們調(diào)試bug的思路應(yīng)該是這樣的:首先割卖,js是否成功的執(zhí)行進(jìn)來;其次患雏,js是否存在邏輯問題鹏溯,變量問題,參數(shù)問題等等淹仑;最后丙挽,如果上述都沒有問題,請仔細(xì)查看各種符號攻人。取试。。

OK斷點(diǎn)就講到這里有不明白的同學(xué)可以在下面留言還有如果大家有什么不懂的知識點(diǎn)或者對前端比較困惑的地方怀吻,也可以在下面留言瞬浓,有空的時候我也會繼續(xù)針對大家的留言寫一些文檔的哦

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蓬坡,隨后出現(xiàn)的幾起案子猿棉,更是在濱河造成了極大的恐慌,老刑警劉巖屑咳,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萨赁,死亡現(xiàn)場離奇詭異,居然都是意外死亡兆龙,警方通過查閱死者的電腦和手機(jī)杖爽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人慰安,你說我怎么就攤上這事腋寨。” “怎么了化焕?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵萄窜,是天一觀的道長。 經(jīng)常有香客問我撒桨,道長查刻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任凤类,我火速辦了婚禮穗泵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谜疤。我一直安慰自己火欧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布茎截。 她就那樣靜靜地躺著,像睡著了一般赶盔。 火紅的嫁衣襯著肌膚如雪企锌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天于未,我揣著相機(jī)與錄音撕攒,去河邊找鬼。 笑死烘浦,一個胖子當(dāng)著我的面吹牛抖坪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闷叉,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼擦俐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了握侧?” 一聲冷哼從身側(cè)響起蚯瞧,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎品擎,沒想到半個月后埋合,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萄传,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年甚颂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡振诬,死狀恐怖蹭睡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贷揽,我是刑警寧澤棠笑,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站禽绪,受9級特大地震影響蓖救,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜印屁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一循捺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雄人,春花似錦从橘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至旗吁,卻和暖如春踩萎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背很钓。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工香府, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人码倦。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓企孩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親袁稽。 傳聞我的和親對象是個殘疾皇子勿璃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

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