如何使JavaScript代码更具防弹性?

Ver*_*sen 1 javascript web typescript

我来自编译语言背景(C/C++/Objective-C),目前正在用JavaScript编写一个完整的应用程序.(实际上是TypeScript,但我的问题对两者都是一样的.)

我遇到的问题是,如果发生单个错误,整个执行流程将停止.例如,如果我有:

myFunction()
{
    doSomethingA();
    doSomethingB();
    doSomethingC();
}
Run Code Online (Sandbox Code Playgroud)

那么如果doSomethingA()有这样的东西:

var myValue = window.myData.myValue;
Run Code Online (Sandbox Code Playgroud)

但是当时"窗口"上不存在"myData",则所有代码STOPS EXECUTING ... doSomethingB()和doSomethingC()都不会执行,并且会记录控制台错误.对于简单的网页来说这可能没问题,但是我正在创建一个应用程序,它不需要莫名其妙地"停止工作".

当然,我可以使用try/catch来"了解"这个错误,但是STILL并没有解决我的问题:我想以doSomethingB()和doSomethingC()继续执行的方式编写代码,即使出现问题.但是,这对我的代码来说是一个巨大的过度简化.想象一下,这些功能有很多.用每个独立的try/catch块包围它们是不切实际的.即使我这样做,即使第一部分中的某些内容失败,我也需要继续执行给定函数的其余部分.

当然,我可以通过使用以下方式"保护"我的变量:

if ( typeof window.myData != "undefined")
Run Code Online (Sandbox Code Playgroud)

要么

if (window.myData.hasOwnProperty("myValue")
Run Code Online (Sandbox Code Playgroud)

但是如果要检查多个级别,例如访问时,则会变得非常混乱:

var myValue = window.myData.something.anotherLevel.somethingElse.value;
Run Code Online (Sandbox Code Playgroud)

现在我必须检查myData,something,anotherLevel和somethingElse是否全部有效,然后才能"安全地"访问此值.这导致非常难看的代码.

有没有更好的方法让我的代码更"防弹"?如果属性意外丢失,我需要代码在问题陈述后继续执行.如果没有"保护"每一个访问数据甚至很少有未定义机会的语句,这是否可能?

Pre*_*fix 5

这就是JavaScript的方式.它不是强类型语言.您有正确的方法检查falsy/undefined.您可以查看一个实用程序库,比如Lodash的isUndefined()方法,可以帮助缓解疼痛.他们有很多辅助方法,比如检查对象类型,数组,对象文字等.

https://lodash.com/docs#isUndefined