一探前端开发中的JS调试技巧菜鸟教程

友情提示:文中涉及较多Gif演示动画,移动端请尽量在Wifi环境中阅读

前言:调试技巧,在任何一项技术研发中都可谓是必不可少的技能。掌握各种调试技巧,必定能在工作中起到事半功倍的效果。譬如,快速定位问题、降低故障概率、帮助分析逻辑错误等等。而在互联网前端开发越来越重要的今天,如何在前端开发中降低开发成本,提升工作效率,掌握前端开发调试技巧尤为重要。

本文将一一讲解各种前端JS调试技巧,也许你已经熟练掌握,那让我们一起来温习,也许有你没见过的方法,不妨一起来学习,也许你尚不知如何调试,赶紧趁此机会填补空白。

那还是互联网刚刚起步的时代,网页前端还主要以内容展示为主,浏览器脚本还只能为页面提供非常简单的辅助功能的时候。那个时候,网页主要运行在以IE6为主的浏览器中,JS的调试功能还非常弱,只能通过内置于Window对象中的alert方法来调试,那时候看起来应该是这个样子:

需要说明一点,这里看到的效果,并非当年的IE浏览器中看到的效果,而是在高版本IE中的效果。此外,当年貌似还没有这么高级的控制台,而alert的使用也是在真实的页面JS代码中。虽然,alert的调试方式很原始,但当时确实有它不可磨灭的价值,甚至到今天,已然有其用武之地。

随着JS在Web前端中能做的事情越来越多,责任越来越大,而地位也越来越重要。传统的alert调试方式已经渐渐不能满足前端开发的种种场景。而且alert调试方式弹出的调试信息,那个窗口着实不太美观,而且会遮挡部分页面内容,着实有些不太友好。

另一方面,alert的调试信息,必须在程序逻辑中添加类似"alert(xxxxx)"这样的语句,才能正常工作,并且alert会阻碍页面的继续渲染。这就意味着开发人员调试完成后,必须手动清除这些调试代码,实在有些麻烦。

所以,新一代的浏览器Firefox、Chrome,包括IE,都相继推出了JS调试控制台,支持使用类似"console.log(xxxx)"的形式,在控制台打印调试信息,而不直接影响页面显示。以IE为例,它看起来像这样:

好吧,再见丑陋的alert弹出框。而以Chrome浏览器为首的后起之秀,为Console扩展了更丰富的功能:

你以为这样就满足了?Chrome开发团队的想象力实在不得不让人佩服:

好了,稍微多说了一点点题外话。总之,控制台以及浏览器内置Console对象的出现,给前端开发调试带来了极大的便利。

有人会问,这样的调试代码不一样需要在调试完成后进行清理吗?

关于这个问题,如果在使用console对象之前先进性存在性验证,其实不删除也不会对业务逻辑造成破坏。当然,为了代码整洁,在调试完成后,还是应尽可能删除这些与业务逻辑无关的调试代码。

JS断点调试,即是在浏览器开发者工具中为JS代码添加断点,让JS执行到某一特定位置停住,方便开发者对该处代码段的分析与逻辑处理。为了能够观察到断点调试的效果,我们预先随意准备一段JS代码:

代码很简单,就是定义一个函数,传入两个数,分别加上一个乱七八糟的随机整数后,再返回两个数的总和。以Chrome开发者工具为例,我们来看一下JS断点调试的基本方法。

首先,测试代码中我们通过上图console的输出结果可以看出代码应该是正常运行了,但是为什么是应该呢?因为函数中加了一个随机数,而最终结果是否真的是正确的呢?这是毫无意义的猜想,但是假设我现在就是要验证一下:函数传入的两个数、被加的随机数,以及最终的总和。那么该怎么操作呢?

方法一,前面讲过最普通的,无论使用alert还是console,我们可以这么来验证:

从上图发现,我们在代码中新增了三行console代码,用以打印我们关心的数据变量,而最终我们从控制台(Console面板)中的输出结果,可以很清楚的验证整个计算过程是否正常,进而达到我们题设的验证要求。

方法二,方法一的验证过程存在很明显的弊端就是,添加了很多冗余代码,接下来我们看一下使用断点进行验证,是否更加方便,先看一个如何加断点,以及断点后是什么效果:

如图,给一段代码添加断点的流程是"F12(Ctrl+Shift+I)打开开发工具"——"点击Sources菜单"——"左侧树中找到相应文件"——"点击行号列"即完成在当前行添加/删除断点操作。当断点添加完毕后,刷新页面JS执行到断点位置停住,在Sources界面会看到当前作用域中所有变量和值,只需对每个值进行验证即可完成我们题设验证要求。

那问题来了,仔细的朋友会发现当我的代码执行到断点的时候,显示的变量a和b的值是已经进行过加法运算后的,我们看不到调用sum函数时初始传入的10和20。那么该怎么办呢?这就要回过头来先学习一下断点调试的一些基础知识了。我们打开Sources面板后其实会在界面中看到如下内容,我们跟着鼠标轨迹逐一看看都是什么意思:

从左到右,各个图标表示的功能分别为:

到此,断点调试的功能键介绍得差不多了,接下来我们就可以一行一行去看我们的程序代码,查看每一行执行完毕之后,我们各个变量的变化情况了,如下图所示:

如上,我们可以看到a、b变量从最初值,到中间加上随机值,再到最后计算总和并输出最终结果的整个过程,完成题设验证要求不在话下。

其余几个功能键,我们稍微改动一下我们的测试代码,用一张gif图来演示他们的使用方法:

这里需要注意一点,直接在代码区打印变量值的功能是在较新版本的Chrome浏览器中才新增的功能,如果你还在使用较老版本的Chrome浏览器,可能无法直接在断点的情况下查看变量信息,此时你可以将鼠标移动到变量名上短暂停顿则会出现变量值。也可以用鼠标选中变量名称,然后右键"Addtowatch"在Watch面板查看,此方法同样适用于表达式。此外,你还可以在断点情况下,切换到Console面板,直接在控制台输入变量名称,回车查看变量信息。该部分比较简单,考虑篇幅问题,不在做图演示。

所谓的Debugger断点,其实是我自己给它命名的,专业术语我也不知道怎么说。具体的说就是通过在代码中添加"debugger;"语句,当代码执行到该语句的时候就会自动断点。接下去的操作就跟在Sources面板添加断点调试几乎一模一样,唯一的区别在于调试完后需要删除该语句。

既然除了设置断点的方式不一样,功能和Sources面板添加断点效果一样,那么为什么还会存在这种方式呢?我想原因应该是这样的:我们在开发中偶尔会遇到异步加载html片段(包含内嵌JS代码)的情况,而这部分JS代码在Sources树种无法找到,因此无法直接在开发工具中直接添加断点,那么如果想给异步加载的脚本添加断点,此时"debugger;"就发挥作用了。我们直接通过gif图看看他的效果:

DOM断点,顾名思义就是在DOM元素上添加断点,进而达到调试的目的。而在实际使用中断点的效果最终还是落地到JS逻辑之内。我们依次来看一下每一种DOM断点的具体效果。

上图演示了对ul子节点(li)的增加、删除以及交换顺序操作触发断点的效果。但需要注意的是,对子节点进行属性修改和内容修改并不会触发断点。

另一方面,由于前端处理的业务逻辑越来越复杂,对一些数据的存储依赖越来越强烈,而将临时数据存储于DOM节点的(自定义)属性中,是很多情况下开发者优先选择的方式。特别是在HTML5标准增强自定义属性支持(例:dataset、data-*之类)之后,属性设置应用越来越多,因此Chrome开发者工具也提供了属性变化断点支持,其效果大致如下:

此方式同样需要注意,对子节点的属性进行任何操作也不会触发节点本身的断点。

这个DOM断点设置很简单,触发方式很明确——当节点被删除时。所以通常情况应该是在执行"parentNode.removeChild(childNode)"语句的时候使用此方式。此方式使用不多。

前面介绍到的基本上是我们在日常开发中经常用到的调试手段,运用得当它们也几乎能应对我们日常开发中的几乎所有问题。但是,开发者工具还考虑到了更多的情况,提供更多的断点方式,如图:

这几年前端开发发生了翻天覆地的变化,从当初的名不见经传到如今的盛极一时,Ajax驱动Web富应用,移动WebApp单页应用风生水起。这一切都离不开XMLHttpRequest对象,而"XHRBreakpoints"正是专为异步而生的断点调试功能。

我们可以通过"XHRBreakpoints"右侧的"+"号为异步断点添加断点条件,当异步请求触发时的URL满足此条件,JS逻辑则会自动产生断点。演示动画中并没有演示到断点位置,这是因为,演示使用的是jQuery封装好的ajax方法,代码已经过压缩,看不到什么效果,而事实上XHR断点的产生位置是"xhr.send()"语句。

XHR断点的强大之处是可以自定义断点规则,这就意味着我们可以针对某一批、某一个,乃至所有异步请求进行断点设置,非常强大。但是,似乎这个功能在日常开发中用得并不多,至少我用得不多。想想原因大概有两点:其一,这类型的断点调试需求在日常业务中本身涉及不多;其二,现阶段的前端开发大多基于JS框架进行,最基本的jQuery也已经对Ajax进行了良好封装,极少有人自己封装Ajax方法,而项目为了减少代码体积,通常选择压缩后的代码库,使得XHR断点跟踪相对不那么容易了。

事件监听器断点,即根据事件名称进行断点设置。当事件被触发时,断点到事件绑定的位置。事件监听器断点,列出了所有页面及脚本事件,包括:鼠标、键盘、动画、定时器、XHR等等。极大的降低了事件方面业务逻辑的调试难度。

演示实例演示了当click事件被触发时和当setTimeout被设置时的断点效果。实例显示,当选中click事件断点之后,两个按钮的被点击时都触发了断点,而当setTimeout被设置时,"SetTimer"断点被触发。

THE END
1.前端开发需要学什么前端开发需要掌握的技能常见问题前端开发是一个综合性职业,要求掌握一系列技术技能和知识。核心技能包括:html 和 css(网页结构和样式)、javascript(交互功能)、响应式设计和移动端开发、前端框架和库、版本控制和协作工具、性能优化和 seo、跨浏览器兼容性以及用户体验和交互设计。 前端开发是一个涉及多个技术领域的职业,需要掌握一系列的技能和知识。https://m.php.cn/faq/713254.html
2.前端应该掌握的一些技能ken丶123前端应该掌握的一些技能 css 1、盒模型 2、flex 3、css单位 4、css选择器 5、bfc 清除浮动 6、层叠上下文 7、常见页面布局 8、响应式布局 9、css预处理,后处理 10、css3新特性 animation和transiton的相关属性 animate和translate 11、display哪些取值https://www.cnblogs.com/wjyz/p/10996847.html
3.Python前端开发需要掌握哪些技能?Python通常被认为是一门后端编程语言,但它也在前端开发领域扮演着越来越重要的角色。Python的灵活性和多功能性使其成为一种强大的工具,用于前端开发。如果您希望在Python前端开发领域取得成功,以下是一些关键技能和知识领域,您需要掌握的: 1. 基本的Python编程 ...http://www.apppark.cn/t-47616.html
4.Web前端开发工程师需要掌握哪些技能?如今互联网科技越来越成熟,随着人们对网站品质要求的提高,web前端开发作为IT行业的重要领域,越来越受到企业和求职者的关注,想要成为一名优秀的web前端开发工程师并不是一件容易的事情,毕竟Web前端开发工程师作为一个专业技术岗位,需要掌握多种技术来构建现代化的网页和应用程序。 https://www.bwie.com/jsgh/193.html
5.10个前端开发需要学习的关键技能毫无疑问,前端开发会是 2020 年技术领域最热门的专业之一。 在过去,前端领域的开发人员只要了解一些 HTML、CSS,也许还有 jQuery,就足以创建交互式网站了;但是今天,他们需要面对广泛而不断变化的生态系统,开发多种多样的技能;他们需要掌握众多工具、库和框架;并且他们还要不断投资自身来学习新的知识。 https://www.jianshu.com/p/af4168a8923d
1.前端开发工程师需要掌握哪些技能?前端技能描述前端开发工程师需要掌握以下技能: 一、基础技能 1. HTML/CSS: - 熟练掌握HTML 标签及其语义化,能够构建合理的网页结构。 - 精通CSS 样式表,包括布局(如 Flexbox、Grid)、响应式设计、动画效果等。 - 了解 CSS 预处理器(如 Sass、Less)。 2.JavaScript: ...https://blog.csdn.net/alankuo/article/details/141778491
2.一个前端工程师到底需要掌握哪些技能?其实在行业里面,对前端工程师的能力模型有一个基本的认知,不同公司的定义可能有细微差别,但是它的内核是一致的。前端专家程劭非给出了一份前端工程师的技能模型,他将前端工程师的进阶之路分为五部分,分别需要掌握不同的技能。 1. 助理工程师 对于这个岗位,程劭非对标的是阿里的 P4 级别。它的要求是基本的编程能力...https://time.geekbang.org/column/article/109641
3.UI设计师需要掌握的技能?零基础小白必看!UI设计师在前端开发方面需要掌握以下设计技能: HTML和CSS:UI设计师需要熟悉HTML和CSS的基础知识,能够理解并编写有效的HTML结构和CSS样式,以实现设计师的视觉效果。 响应式设计:随着移动设备的普及,响应式设计已成为现代UI设计的重要要求。UI设计师需要了解响应式设计的原理和技巧,能够根据不同设备的屏幕尺寸和分辨率,为...https://pixso.cn/designskills/ui-design-skills/
4.前端架构师需要具备的技能有哪些综上所述,前端架构师需要具备扎实的技术基础、良好的设计能力、精通性能优化、熟悉前后端交互、掌握项目管理技能、持续学习与创新能力以及良好的沟通能力等多方面的技能。这些技能将帮助前端架构师在项目中发挥更大的作用,为团队和企业创造更多的价值。https://blog.51cto.com/u_14846619/11383428
5.前端工程师Web开发者必须掌握的10大技能2011年Web开发者必须掌握的10大技能要成为一名优秀的Web开发者,是没有捷径可以走的。我们是要不断学习,不断进步的。本文介绍了Web开发者须掌握的十项技能,一起来看。AD: 很多的 WWeb 开发人人员认为为他们目目前掌握握的技能能已经可可以维持持他们的的工作。但但是,请请检查以以下列出出的100 大技技能,如如果...https://m.renrendoc.com/paper/224133305.html
6.物联网行业的职位需要掌握的技能有哪一些网是一个很大的概念,很多小伙伴问,想进入物联网行业,需要掌握些什么技能? 一、关于物联网 IOT:The Internet of Things,物联网。 物联网是指通过 各种信息传感器、射频识别技术、全球定位系统、红外感应器、激光扫描器等各种装置与技术,实时采集任何需要监控、 连接、互动的物体或过程,采集其声、光、热、电、力...https://m.elecfans.com/article/1149340.html
7.前端工作总结(通用7篇)了解Web服务器当你对Apache的基本配置,htaccess配置技巧有一些掌握的话,将来必定受益,而且这方面的知识学起来也相对容易。 需要熟练掌握的技能 熟悉版本控制系统的用法熟悉使用一种优秀的版本控制系统,你在实际工作中就会发现精通一种版本控制系统是很幸福的事情。 https://www.unjs.com/fanwenwang/gzzj/20210126105043_3006755.html
8.前端工作总结(通用12篇)了解Web服务器当你对Apache的基本配置,htaccess配置技巧有一些掌握的话,将来必定受益,而且这方面的知识学起来也相对容易。 需要熟练掌握的技能 熟悉版本控制系统的用法熟悉使用一种优秀的版本控制系统,你在实际工作中就会发现精通一种版本控制系统是很幸福的事情。 https://www.ruiwen.com/gongwen/gongzuozongjie/555535.html
9.前端学习计划四、前端学习计划的.实施步骤 了解重要性、制定计划和学习计划的内容后,就需要行动起来,进行实施学习计划。实施步骤可以包括以下三个部分: 1、选择好适合自己的学习资料,阅读文献和相关书籍。 2、划定学习时间和学习目标,最好是每天都要学习一些内容。 3、通过实际操作,梳理出是否存在学习盲点、进一步掌握技能和完善知...https://www.yjbys.com/xuexi/jihua/4324249.html
10.计算机网络毕业实习报告(精选15篇)通过这次实习,我深刻体会到了计算机网络技术的实际应用和重要性。我不仅掌握了更多的专业技能,还学会了如何与客户有效沟通、如何解决问题以及如何在团队中协作。同时,我也认识到了自己在专业知识和实践能力方面的不足,需要不断学习和提高自己的综合素质。 五、总结与展望 ...https://www.oh100.com/a/202211/5675576.html
11.前端开发实习生岗位职责(工作内容,是做什么的)前端开发实习生需要掌握什么技能 HTML CSS JS 交互设计 响应式设计 关注细节 成为一名前端开发实习生应该具备哪些能力?学习哪些知识?掌握哪些专业技能?前端开发实习生岗位职责 前端开发实习生 岗位职责来自 合合信息 工作职责:1、协助团队进行前端开发工作,包括但不限于网站和应用程序的设计、开发和测试等工作...https://m.jobui.com/gangwei/qianduankaifashixisheng/skill/