译者按: 切换成本真的不高,建议使用开发者工具来Debug!

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

在我成为一名开发者路上也掉进过一些坑,对于新手来说一个最大的挑战就是debug。刚开始,我一度认为在控制台下使用console.log()打印变量是最棒的方法。而实际上,这样做是相当低效的。我不怕你们嘲笑我,给你们分享一下我曾经是这么干的:

console.log(‘Total Price:’, total) // 查看total的值

console.log(‘Here’) // 打印Here来确认程序执行到这个地方

我想大多数开发者会意识到这不是你应该用来debug的方法,应该有更好的方案!

幸运的是,浏览器的Debug工具很好用!在本文我会介绍谷歌开发者工具。

为了更好地跟随我理解这篇文章的内容,我建议你代开我的示例代码跟着走。地址: 点击这里

第一步:复现BUG

我们通过执行一系列的操作来复现bug:

  1. 一个代码有bug的计算器,如果你还没有打开,点击这里
  2. 在Entree 1输入12;
  3. 在Entree 2输入8;
  4. 在Entree 3输入10;
  5. 在Tax输入10;
  6. Tip选择20%;
  7. 点击Calculate Bill。正确的结果应该是39.6,但是计算器的结果却是14105.09!

第二步:学习使用Source面板

你需要学会熟练使用开发者工具,你可以使用快捷键Command+Option+I (Mac) 或则 Control+Shift+I (Linux)来打开。(或则右键,选择检查选项,就会弹出开发者面板)

当你点击开发者面板最上面的source标签,开发者面板会呈现三分的效果,分别是:文件导航器、源代码编辑器以及最右侧的Debug面板。

第三步:设置第一个断点

在我们设置断点之前,我来给你演示如果使用console.log()是什么效果:

如果你使用开发者工具,就不用写一堆的console.log()了。我们可以设置断点,通过单步调试来查看变量的值。

断点就是一个你在代码中添加标记,用来告诉浏览器执行到这个位置暂停。

我们将会在整个程序的最开始设置一个断点。

在最右侧的Debugger面板,点击"Event Listener Breakpoints",展开"Mouse",然后选中'click'。

现在如果我们点击Calculate Bill按钮,程序会停在第一个函数"onClick()"。如果没有执行到这里,那么点击播放按钮,总会跳到index的第6行。

第四步:单步调试

在整个Debug的过程中,有两种执行的方式:”step into"和“step over"。

“step into"会进入当前遇到的每一个函数内部,然后一行一行执行;

“step over”则会跳过函数内部的细节,直接执行整个函数。

下面是一个展示例子,在右侧的Scope下,所有局部变量的值都显示出来了。

第五步:在某行设置断点

可以单步调试代码是不是很棒?不过一步一步往下执行有点繁琐。通常,我只想知道在某个位置变量的值,而不是要一步一步执行过去。我们可以在某一行去设置断点。

作者备注:能够在代码任意行设置断点查看变量值是我停止使用console.log的主要原因。

在文件的左侧,显示文件行数的位置点击即可设置断点。

注意:如果你发现无法操作,请先清除掉之前选中的click选项。

你可以看到,右侧显示subtotal的值为10182,并且在代码旁边也显示了变量的值。

我想已经知道BUG的原因了:字符串拼接?

第六步:添加观察表达式

这个通常用来观察变量的值在程序的执行过程中的变化,点击右侧的"watch"选项将其展开,你可以输入变量名或者表达式。

为了演示起见,我们观察"entree 1"和"typeof entree1"。

通过查看entree1的类型,发现并不是数字而是字符串。那么问题就出在如何获取这个值的。也许,querySelector()是问题的关键。

第七步:修复代码

通过进一步检查,确定querySelector()就是问题所在。

如何修复呢?我们可以使用Number函数将字符串转换为数字,比如Number(getEntree1())

为了编辑代码,你需要到“Elements"选项,它在”Sources"的左侧。如果你没有看到JavaScript代码,你需要展开script标签。 然后右键点击选择“edit as html"。

如果你建立了一个workspace,那么代码会直接保存。不然,可以使用command+s (mac) 或则 control+s (linux)保存一份本地拷贝。

接下来,我们再来试一试看看效果。

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了9亿+错误事件,得到了Google、360、金山软件、百姓网等众多知名用户的认可。欢迎免费试用!

版权声明

转载时请注明作者Fundebug以及本文地址:

https://blog.fundebug.com/2018/12/11/stop-using-console-log/

抛弃console.log(),拥抱浏览器Debugger的更多相关文章

  1. webpack打包时删除console.log,和debugger

    开发过程中我们不可避免的需要console.log调试,然而在上线时如果不删除这些console.log可能会造成内存泄漏,因为console.log出来的变量是不会被GC的,webpack给我们提供 ...

  2. webpack打包去掉console.log打印与debugger调试

    如图,找到build/webpack.prod.conf.js 在 UglifyJsPlugin 插件下添加下列代码 drop_debugger: true, drop_console: true

  3. 解析浏览器和nodejs环境下console.log()的区别

    写在前面的 在开发调试过程中,我们经常需要调用console.log 方法来打印出当前变量的值,然而,console.log在浏览器环境下 有时会出现一些异常的现象 开撸代码 在浏览器和nodejs环 ...

  4. [技巧篇]13.从今天开始做一个有理想的人,放弃alter的调试,拥抱console.log

    在js前端开发时,为了调试经常会加上 console.log.但是在有的浏览器(比如IE)中会报错,怎么办呢?好像10之后也开始支持了!如果以防方一,可以使用如下方式 在js文件最前面添加如下js代码 ...

  5. 在浏览器控制台输出内容 console.log(string);

    在浏览器控制台中写如数据 1添加    <script type="text/javascript">djConfig = { isDebug: true };< ...

  6. console.log在IE浏览器中会有异常

    因为在IE浏览器无此方法,故此重写 方法一: var console = console || { log: function () { return false; } }; 方法二:window.c ...

  7. IE6789浏览器使用console.log类似的方法输出调试内容但又不影响页面正常运行

    问题来源:外网IE下,触发js报错.经检测,未清除console造成.清除console后,解决. 问题原因:console.log 原先是 Firefox 的“专利”,严格说是安装了 Firebug ...

  8. 浏览器好玩的的 console.log

    现在很多网站,你在访问他页面的时候, 你要查看 console 的话, 看到有文章介绍的,一定想知道是怎么展示来的吧 如 baidu 的 你懂的,其实很简单,代码如下, console 输出下就行 c ...

  9. console.log、toString方法与js判断变量类型

    Java调用system.print.out()是会调用toString方法打印js里的console.log也是控制台打印,很多时候,我们以为也是调用toString方法,其实并不是.我们在chro ...

随机推荐

  1. python多线程在渗透测试中的应用

    难易程度:★★★ 阅读点:python;web安全; 文章作者:xiaoye 文章来源:i春秋 关键字:网络渗透技术 前言 python是门简单易学的语言,强大的第三方库让我们在编程中事半功倍,今天, ...

  2. webpack严格模式!!!忽略

    1. babel5 babel: { options: { blacklist: ["useStrict"], // ... }, // ... } 2. babel6 修改.ba ...

  3. #Java学习之路——基础阶段(第一篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...

  4. 第57节:Java中流的操作以及编码解码

    我的博客: https://huangguangda.cn/ https://huangguangda.github.io/ 前言: 编码解码:编码时将信息从一种形式变成为另一种形式,成为编码.编码为 ...

  5. Metasploit Framework(7)客户端渗透(下)

    文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 应用场景: Kali机器IP:192.168.163. ...

  6. Spark基础-scala学习(四、函数式编程)

    函数式编程 将函数赋值给变量 匿名函数 高阶函数 高级函数的类型推断 scala的常用高阶函数 闭包 sam转换 currying函数 return 将函数赋值给变量 scala中的函数是一等公民,可 ...

  7. 程序员IT计算机中常见英语单词

    abstract 抽象的 abstract base class (ABC)抽象基类 abstract class 抽象类 abstraction 抽象.抽象物.抽象性 access 存取.访问 ac ...

  8. Python You-Get (送你一个免广告的视频和音乐网站 VIP)

    You-get可以在仅仅提供URL情况下就可以实现下载视频.图片.音乐等信息.也可以通过播放器在线观看视频或听音乐,重要的是再也不用烦恼弹出的广告了,如果你想观看视频,但又不想观看广告,并且你还想把视 ...

  9. input01.sh: line 11: warning: here-document at line 4 delimited by end-of-file (wanted `EOF') input01.sh: line 12: syntax error: unexpected end of file

    写了个脚本用cat>>EOF报错如下: input01.sh: line 11: warning: here-document at line 4 delimited by end-of- ...

  10. C# 获取 sha256

    C# 获取 sha256, 输入可以是 字符串,也可以是 字节流流: 自定义的输入类型的枚举: public enum Sha26ParseType { StringType, StreamType ...