实用 JavaScript 调试技巧

大家好,我是若川。持续组织了8个月源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外:目前建有江西|湖南|湖北 籍 前端群,可加我微信进群。

作为前端开发,我们会经常使用 console.log() 来调试程序中的问题。虽然这种方式也能解决一部分问题,但是它的效率不如能执行逐步调试的工具。本文就来学习一下如何使用 Google Chrome developer tools 轻松调试 JavaScript 代码。

多数浏览器都提供了DevTools 供我们调试 JavaScript 应用程序,并且它们的使用方式类似,只要我们学会了如何在一个浏览器上使用调试工具,就很容易在其他浏览器上使用它。

以下就以 Greet Me 程序为例,这个程序非常简单,只需输入名字和愿望,最后会输出一句话:

0511ee1b534d748701ccea3f9d812759.png

当输入两个表单值之后,“愿望”部分没有正确打印,而是打印出了NaN。代码在线调试:https://greet-me-debugging.vercel.app/。接下来,就看看 Chrome DevTools 有什么功能可以调试定位代码的问题。

一、了解 Sources 面板

DevTools 提供了许多不同的工具供我们进行调试,包括 DOM 检查、分析和网络调用检查等。这里要说的是 Sources 面板,它可以帮助我们调试 JavaScript。可以使用快捷键 F12 打开控制面板,并单击 Sources 选项卡以导航到 Sources 面板,也可以直接使用快捷键 Command+Option+I(Mac)或 Control+Shift+I(Windows、Linux)来打开。

95f7af444fecb345b8c48150b51c0945.png

Sources 面板主要由三个部分组成:

7efb4e0088fcee01583c0b778fd5f7e1.png
  1. 文件导航区:页面请求的所有文件都会在此列出;

  2. 代码编辑区:当我们从文件导航栏中选取一个文件时,该文件的内容就会在此列出,我们可以在这里编辑代码;

  3. Debugger区:这里会有很多工具可以用来设置断点,检查变量值、观察执行步骤等。

如果 DevTools 窗口较宽或未在单独的窗口中打开,则调试器部分将显示在代码编辑器的右侧:

539262e518bf873b1e8e3a6a51ee9e1a.png

二、设置断点

要开始调试代码,首先要做的就是设置断点,断点就是代码执行暂停以便调试它的逻辑点。

DevTools 允许我们以不同的方式来设置断点:

  • 在代码行;

  • 在条件语句中;

  • 在 DOM 节点处;

  • 在事件侦听器上。

1. 在代码行设置断点

设置代码行断点的步骤:

  • 单击切换到 Sources 选项卡;

  • 从文件导航部分选中需要调试的源文件;

  • 在右侧代码编辑器区域找到需要调试的代码行;

  • 单击行号以在行上设置断点。

28b7cfdbb2dd81fcf11cf1b09fe18267.png

这里就在代码的第 6 行设置了一个断点,代码在执行到这里时就会暂停。

2. 设置条件断点

设置条件断点的步骤:

  • 单击切换到 Sources 选项卡;

  • 从文件导航部分选中需要调试的源文件;

  • 在右侧代码编辑器区域找到需要调试的代码行;

  • 右键单击行号并选择"Add conditional breakpoint"来添加条件断点:

d3e68ebbb29123542f7cf01b59dfab0c.png

点击之后代码行下方就会出现一个对话框,输入断点的条件即可:

661b4c67561122a1c85ed6974b629855.png

按回车键(Enter)即可激活断点,这时就会在打断点行的顶部出现一个橙色的图标:

d8e53303b39577f765290d2ae6e1fa24.png

当print()方法中的name变量值为Joe时,代码的执行就会暂停。需要注意,只有我们确定调试的代码的大致范围时,才会使用条件断点。

3. 在事件监听器上设置断点

在事件监听器上设置断点的步骤:

  • 单击切换到 Sources 选项卡;

  • 在debugger区域展开Event Listener Breakpoints选项;

  • 从事件列表中选择事件监听器来设置断点。我们的程序中有一个按钮单击事件,这里就选择 Mouse 事件选项中的click。

49105b24dcbbd1581db674b3cb99dae1.png

提示:当我们想暂停在事件触发后运行的事件侦听器代码时可以使用此选项。

4. 在 DOM 节点中设置断点

DevTools 在 DOM 检查和调试方面同样很强大。当在 DOM 中添加、删除或者修改某些内容时,可以设置断点来暂停代码的执行。

在 DOM 上设置断点的步骤:

  • 单击切换到 Elements 选项卡;

  • 找到要设置断点的元素;

  • 右键单击元素以获得上下文菜单,选择Break on选项,然后选择Subtree modifications、Attribute modifications、Node removal中的一个即可:

85a160cbd4290cec23bb5d2c66194ad5.png

这三个选项的含义如下:

  • Subtree modifications:当节点内部子节点变化时断点;

  • Attribute modifications:当节点属性发生变化时断点;

  • Node removal:当节点被移除时断点。

如上图,我们在输出消息的 div 的 DOM 发生变化时设置了一个断点。当点击按钮后,问候消息输出到 div 中,子节点的内容发生了变化,就会发生中断。

注意: 当我们怀疑是DOM更改导致了错误时,就可以使用该选项,当 DOM 更改中断时,相关的 JavaScript 代码执行将自动暂停。

三、逐步调试

现在我们知道了设置断点的方式。在复杂的调试情况下,我们可能需要使用这些调试的组合。调试器提供了五个控件来逐步执行代码:

d0d0f260289c825706b189fcd9dee585.png

下面就分别来看看这些控制都是如何使用的。

1. 下一步(快捷键:F9)

此选项使我们能够在JavaScript代码执行时逐行执行,如果中途有函数调用,单步执行也会进入函数内部,逐行执行,然后退出。

693e2dffff817935035859bcf988f895.gif

2. 跳过(快捷键:F10)

此选项允许我们在执行代码时跳过一些代码。有时我们可能已经确定某些功能是正常的,不想花时间去检查它们,就可以使用跳过选项。

下面就是单步执行logger()函数时,会跳过函数的执行:

16f6e16063cab6e267ab44c9ba29b9fd.gif

3. 进入(快捷键:F11)

使用该选项可以更深入地了解函数。单步执行函数时,当感觉某个函数的行为异常并想检查它时,就可以使用这个选项来进入函数内部并进行调试。

下面就是单步执行 logger() 函数:

81c567e2c972ee618d4837c90a33c488.gif

4. 跳出(快捷键:Shift+F11)

在单步执行一个函数时,我们可能不想再继续执行并退出它,就可以使用这些选项退出函数。

下面就是进入了 logger() 函数内部,然后立即退出:

75d3281687fbe9ba776aa2b4ff878099.gif

5. 跳转(快捷键:F8)

有时,我们希望从一个断点跳转到另一个断点,而无需在它们之间进行任何调试,就可以使用这个选项来跳转到下一个断点:

5f72c418aeb4382f23372d28fd4834c1.gif

四、检查范围、调用堆栈和值

当进行逐行调试时,检查变量的范围和值以及函数调用的调用堆栈。在Debugger区可以这三个选项:

bccc7de48c5b226be66b0f1075f0b4c0.png

1. 范围(Scope)

可以在 Scope 选项中查看局部范围和全局范围内的内容以及变量,还可以看到 this 的实时指向:

af47f993e3cf7ff10f3aa01e72bf5504.png

2. 调用堆栈

调用堆栈面板有助于识别函数执行堆栈:

f868cfd98bcb3faec1c2e8f3e0727dc8.png

3. 值

检查代码中的值是识别代码中错误的主要方法。在单步执行时,我们只需要将鼠标悬停在变量上即可检查值。

下面可以看到变量 name 在代码执行时的检查值:

4b6853ff361f50afd6514b00179058c9.png

此外,我们可以选择打码的一部分作为表达式来检查值。在下面的例子中,选择了表达式document.getElementById('m_wish') 来检查值:

c9c56641890d3f1e4600df2a042a218e.png

4. Watch

Watch 部分允许添加一个或多个表达式,并在执行时监视它们的值。当我们想在代码逻辑之外进行一些计算时,这个功能非常有用。我们可以组合来自代码区域的任何变量,以形成有效的JavaScript表达式。在逐步执行时,就能看到表达式的值。

以下是添加 Watch 的步骤:

  1. 单击 Watch 上的 + 按钮:

830312508311c0fbfec2001f9c271a92.png
  1. 添加要监控的表达式。在这个例子中,添加了一个希望观察其值的变量:

82870a3070d449c8a035719769d782f9.png

另一种观察表达式值的方法是从控制台的console中添加:

e6b21e1b7cf7240a4551ca89f9065aea.png

五、禁用和删除断点

可以点击以下按钮来禁用所有的断点:

b2c9499a9a7d451842a36b509f17fdbd.png注意,上述方法不会删除断点,只会在暂时停用它们。要再次激活这些断点,只需再点一次这个断点即可。

通过取消选中的复选框,可以从“Breakpoints”面板中删除一个或多个断点。通过右键单击并选择“删除所有断点”选项,可以删除所有断点:

5e882503d5bf4a41cc5a1d1608b75f16.png

六、使用 VS Code 调试 JavaScript

Visual Studio code 中一些实用的插件可以用于 JavaScript 代码的调试。可以安装一个名为“Debugger for Chrome”的插件来调试代码:

26d9b1615f36939ee90407c988e10003.png

安装之后,单击左侧的 run 选项并创建配置以运行/调试 JavaScript 应用程序。

f41bd5235248880ca87b1402b2c8dc23.png

这样就会创建一个名为 launch.json 的文件,其中包含一些设置信息:

{"version": "0.2.0","configurations": [{"type": "chrome","request": "launch","name": "Debug the Greet Me app","url": "<http://localhost:5500>","webRoot": "${workspaceFolder}"}]
}

可以修改以下参数:

  • name : 任意名称;

  • url:本地运行的 URL;

  • webRoot:默认值为 ${workspaceFolder},即当前文件夹。可能将其更改为 项目入口文件即可。

最后一步是通过单击左上角的播放图标开始调试:

81b5f58cdb693c3e9513f281b642676b.png

这个调试器类似于DevTools,主要有以下部分:

  1. 启用调试。按播放按钮启用调试选项。

  2. 用于单步执行断点以及暂停或停止调试的控件。

  3. 在源代码上设置断点。

  4. 范围面板查看变量范围和值。

  5. 用于创建和监视表达式的监视面板。

  6. 执行函数的调用栈。

  7. 要启用、禁用和删除的断点列表。

  8. 调试控制台读取控制台日志消息。

f966e35c33f6ec279475a2025ea5bc4d.png

最后,回到最开始的问题,这里不再一步步调试,通过上述的调试方法判定,只需要在 wish 变量前面加一个 + 即可:

const message = 'Hello ' + name + ', Your wish `' + + wish + '` may come true!';

本文翻译自 Tapas Adhikary 的原创文章,已获得作者翻译、转载授权!

作者:Tapas Adhikary

译者:CUGGZ

原文链接:https://blog.greenroots.info/the-definitive-guide-to-javascript-debugging-2021-edition

9ee0343395a9b8a98ce139924f3356ad.gif

················· 若川简介 ·················

你好,我是若川,毕业于江西高校。现在是一名前端开发“工程师”。写有《学习源码整体架构系列》20余篇,在知乎、掘金收获超百万阅读。
从2014年起,每年都会写一篇年度总结,已经坚持写了8年,点击查看年度总结。
同时,最近组织了源码共读活动,帮助3000+前端人学会看源码。公众号愿景:帮助5年内前端人走向前列。

2bf4d6f464523860df230bd4714c70bc.png

扫码加我微信 ruochuan02、拉你进源码共读

今日话题

目前建有江西|湖南|湖北 籍 前端群,想进群的可以加我微信 ruochuan12 进群分享、收藏、点赞、在看我的文章就是对我最大的支持~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/274743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据挖掘 点击更多 界面_6(更多)技巧,可快速改善用户界面

数据挖掘 点击更多 界面重点 (Top highlight)Creating beautiful, usable, and efficient UIs takes time, with many design revisions along the way.创建漂亮&#xff0c;可用和高效的UI需要花费时间&#xff0c;并且在此过程中进行了许多设计修订。 Making those constant…

Koa在实际的业务场景中,路由如何做分割?【文末留言送书】

大家好&#xff0c;我是若川。文末留言送书&#xff0c;具体规则文末说明。另外为了鼓励大家多写源码共读笔记&#xff0c;我会在写了5次及以上笔记的作者群里也抽奖送这本书。以后也会有更多福利倾斜。导读&#xff1a;Koa是一个Node框架&#xff0c;在Node开源社区中&#xf…

设计模式_设计

设计模式Thanks for my colleague WanChing‘s help to prepare this sharing article. E-Commerce app collects plentiful products from various brands. Each brand has its brand signature colors and public image. This article introduces how we made a single page …

使用 GTD 优化自己的工作和生活

大家好&#xff0c;我是若川。持续组织了8个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外…

模仿不再受宠若惊

If you haven’t heard of the Jio-Zoom plagiarism clash, you’re probably living under a rock (which may not be a bad idea given the state of the world right now). The turf war between Jio Meet and Zoom began when the Indian telecom giant ripped off the Chi…

Vue2剥丝抽茧-响应式系统 系列

大家好&#xff0c;我是若川。持续组织了8个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外…

word文本样式代码样式_使用文本样式表达创建真相来源

word文本样式代码样式As of After Effects 17.0, you can use expressions to edit text styles in After Effects. Here’s why this would transform your workflow:从After Effects 17.0开始&#xff0c;您可以使用表达式在After Effects中编辑文本样式。 这就是这将改变您的…

前端框架源码解读之Vite

前端工具链十年盘点&#xff1a;https://mp.weixin.qq.com/s/FBxVpcdVobgJ9rGxRC2zfgWebpack、Rollup 、Esbuild、Vite ?webpack: 基于 JavaScript 开发的前端打包构建框架&#xff0c;通过依赖收集&#xff0c;模块解析&#xff0c;生成 chunk&#xff0c;最终输出生成的打包…

hp-ux_UX中的格式塔-或-为什么设计师如此讨厌间距

hp-uxI’ve been lucky so far in my design career to have worked with engineers that seem genuinely interested in learning about design. Perhaps, as mentioned in the title, it’s more about them trying to figure out why it matters so much to us that there i…

JavaScript 数组新增 4 个非破坏性方法!

大家好&#xff0c;我是若川。持续组织了8个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外…

自行车改装电动车怎么样_电动车听起来应该是什么样?

自行车改装电动车怎么样The sound of an all-electric car accelerating doesn’t have to sound like a standard combustion engine, It could sound like anything.全电动汽车加速的声音不必听起来像是标准的内燃机&#xff0c;它可以听起来像任何东西。 These were the wor…

谷歌pay破解_Google Pay缺少Google闻名的一件事-UX案例研究

谷歌pay破解Disclaimer: The views expressed in the blog post is purely based on personal experience. It was not influenced by any external factor.When Google launched Tez (now Google Pay) in India during 2017, their primary goal was to design a simple payme…

进阶高级前端,这位大前端架构师一定不能错过

今天给大家介绍一位好朋友&#xff1a;这波能反杀&#xff1a;一位拥有十年工作经验&#xff0c;对学习方法有独到理解的资深大前端架构师。一、博客早在 2017 年初&#xff0c;波神在简书平台以《前端基础进阶》为名&#xff0c;更新了一系列优质文章&#xff0c;获得大量认可…

memcached应用策略(转)

memcached应用策略&#xff08;转&#xff09;(2012-04-05 11:10:02) 转载▼标签&#xff1a; memcached 应用策略 it分类&#xff1a; linux_c memcached应用策略memcached 主要的作用是为减轻大访问量对数据库的冲击&#xff0c;所以一般的逻辑是首先从memcached中读取数据&a…

突然讨厌做前端,讨厌代码_为什么用户讨厌重新设计

突然讨厌做前端,讨厌代码重点 (Top highlight)The core of design thinking is to only design something that will bring value and fill the gap in consumer needs. Right? Why else would one design something that no one asked for? While that may be true to some …

那些年我面过的「六年经验」的初级工程师

大家好&#xff0c;我是若川。持续组织了8个月源码共读活动&#xff0c;感兴趣的可以 点此加我微信ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外…

更多信息请关注微信公众号_为什么我们更多地关注表面异常?

更多信息请关注微信公众号Don’t you feel lucky to find a single seasoned curly fry in your bunch of plain old boring french fries? Do you remember highlighting important texts of your study materials before the exams? Both situations might seem irrelevant…

eclipse中的汉字极小的解决方案(转载)

eclipse中的汉字极小的解决方案(转载) 可能新装了eclipse后&#xff0c;写java代码的时候发现&#xff0c;写注释的时候发现&#xff0c;汉字小的可怜&#xff0c;网上搜一下&#xff0c;又是改字体又是设置字体大小&#xff0c;试用后发现都不是针对这个的方法。 无奈在自己摸…

面试官经常问的观察者模式如何实现~

大家好&#xff0c;我是若川。持续组织了8个月源码共读活动&#xff0c;感兴趣的可以 点此加我微信ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外…

旅行者 问题_门槛项目:没有旅行者回到他的原籍城市。

旅行者 问题Sohini Mukherjee| MFA| Spring 2020Sohini Mukherjee | 外交部| 2020年Spring Artivive app to see the full Artivive应用程序可查看完整的#AR experience.#AR体验。 Prompt:提示&#xff1a; As second semester, first year graduate students, you are at a …