糟糕,我又做了一次:调试常见的JavaScript错误



有时编写JavaScript代码很困难,有时又很令人恐惧,这是许多开发人员所熟悉的。 在此过程中,不可避免地会出现错误,并且经常会重复其中的一些错误。 专为新手开发人员设计的文章讨论了这些错误以及如何解决它们。 为了清楚起见,功能,属性和对象的名称取自一首流行的歌曲 。 所有这些有助于快速记住如何解决常见错误。

我们提醒您: 对于所有“哈勃”读者来说,使用“哈勃”促销代码注册任何Skillbox课程时均可享受10,000卢布的折扣。

Skillbox建议:实用课程“ Mobile Developer PRO”

TypeError:属性未定义


let girl = { name: "Lucky", location: "Hollywood", profession: "star", thingsMissingInHerLife: true, lovely: true, cry: function() { return "cry, cry, cries in her lonely heart" } } console.log(girl.named.lucky) 

上面的示例代码抛出Uncaught TypeError:无法读取未定义错误的属性“ lucky”。 问题在于,尽管有一个name属性,但是girl对象没有named属性。 而且由于未定义属性girl.named,因此无法访问它,因为它正式不存在。 但是,如果将girl.named.lucky替换为girl.name,则一切正常,程序将返回Lucky。

此处阅读有关属性的更多信息。

解决TypeError错误的方法


当程序员尝试对与特定类型不匹配的数据执行操作时,会发生TypeError错误。 例如,使用.bold(),请求未定义的属性或调用实际上不是函数的函数。

因此,如果您尝试调用girl(),则会出现Uncaught TypeError错误:yourVariable.bold不是函数,而girl不是函数,因为实际上对象是调用的,而不是函数。

为了消除错误,您需要研究变量。 那女孩是什么? 女孩的名字是什么? 您可以找出是否要分析代码,使用带有console.log的debugger命令或在控制台中调用变量名称来显示变量。 您需要确保可以使用变量中包含的数据类型进行操作。 如果不合适,请进行更改,例如,添加条件或try..catch块并获得对该操作的控制权。

堆栈溢出


如果您相信歌曲《 Baby One More Time》(这是Britney Spears,呵呵)这首歌的作者,那么在这种情况下击中一词意味着歌手再次被呼唤的愿望(这是对歌曲背景的一种解释,大约是翻译)。 这种愿望很可能会导致现实生活中的通话数量增加。 但是在编程中,这是递归,如果调用堆栈溢出,则可能导致错误。

错误如下:

错误:堆栈空间不足(边缘)
InternalError:太多的递归(Firefox)
RangeError:超出最大调用堆栈大小(Chrome)

如果开发人员未在递归中考虑基本情况,或者代码未解决提供的情况,则会发生堆栈溢出。

 function oneMoreTime(stillBelieve=true, loneliness=0) { if (!stillBelieve && loneliness < 0) return loneliness++ return oneMoreTime(stillBelieve, loneliness) } 

在这种情况下,stillBelieve永远不能设置为false,因此每次都会调用oneMoreTime,但是函数永远不会结束。

如果您开始希望有两个朋友,这将减少孤独感(寂寞),您不能等待通话。

 function oneMoreTime(stillBelieve=true, loneliness=0) { if (!stillBelieve && loneliness < 0) return loneliness-- stillBelieve = false return oneMoreTime(stillBelieve, loneliness) } 

例如,在某些情况下,无限循环会导致系统未给出错误消息,并且执行JavaScript代码的页面只是冻结。 如果while循环没有终止条件,则会发生这种情况。

 let worldEnded = false while (worldEnded !== true) { console.log("Keep on dancin' till the world ends") } 

您可以按照以下方式解决问题:

 let worldEnded = false while (worldEnded !== true) { console.log("Keep on dancin' till the world ends") worldEnded = true } 

调试无限循环和递归


如果您遇到无限循环问题,请在Chrome或Edge中关闭标签,在Firefox中,关闭浏览器窗口。 之后,您需要仔细分析代码。 如果找不到问题,则应将调试器命令添加到循环或函数中,并检查变量的值。 如果结果与预期不符,则进行更换即可轻松完成。

在上面的示例中,应将调试器添加为函数或循环的第一行。 然后,您需要通过分析范围中的变量在Chrome中打开调试标签。 使用下一步按钮,您可以在每次迭代时跟踪它们的变化。 这样做很简单,而且在大多数情况下是问题所在。

您可以在此处( 对于Chrome )和此处( 对于Firefox )阅读更多有关这一切的信息。

语法错误


最常见的JavaScript错误之一是SyntaxError。 避免他们帮助扩展文本编辑器。 因此,括号对着色器用不同的颜色标记代码中的括号,而Prettier或类似的分析工具使快速查找错误成为可能。 减少SyntaxError可能性的最佳选择是最小化嵌套。

在评论中分享:为了避免错误或快速发现并消除错误,您该怎么做?

Skillbox建议:

Source: https://habr.com/ru/post/zh-CN450194/


All Articles