我有编译语言背景 (C/C++/Objective-C),目前正在用 JavaScript 编写一个成熟的应用程序。 (实际上是 TypeScript,但我的问题对两者都是一样的。)
我遇到的问题是,如果出现一个错误,整个执行流程就会停止。例如,如果我有:
myFunction()
{
doSomethingA();
doSomethingB();
doSomethingC();
}
然后如果 doSomethingA() 有这样的东西:
var myValue = window.myData.myValue;
但当时“窗口”上不存在“myData”,然后所有代码停止执行... doSomethingB() 和 doSomethingC() 不执行,并记录控制台错误。这对于简单的网页来说可能没问题,但我正在创建一个应用程序,它不需要莫名其妙地“停止工作”。
当然,我可以使用 try/catch 来“意识到”这个错误,但这仍然不能解决我的问题:我想以某种方式编写代码,使 doSomethingB() 和 doSomethingC() 继续执行,即使出现问题。 但是,这是对我的代码的过度简化。想象一下有很多这样的功能。用自己单独的 try/catch block 包围每个是不切实际的。即使我这样做了,我也需要给定函数的其余部分继续执行,即使第一部分中的某些部分失败了也是如此。
当然,我可以使用以下方法“保护”我的变量:
if ( typeof window.myData != "undefined")
或
if (window.myData.hasOwnProperty("myValue")
但是如果你有多个级别要检查,那会变得非常困惑,比如在访问时:
var myValue = window.myData.something.anotherLevel.somethingElse.value;
现在,在“安全”访问该值之前,我必须检查 myData、something、anotherLevel 和 somethingElse 是否都有效。这会导致代码非常难看。
有没有更好的方法让我的代码更“防弹”?如果某个属性意外丢失,我需要代码在问题陈述之后继续执行。如果不“保护”访问数据的每一个语句,即使有很小的机会未定义,这是否可能?
最佳答案
JavaScript 就是这样。它不是强类型语言。您有正确的方法检查虚假/未定义。您可以查看实用程序库,例如 Lodash 的 isUndefined()
方法,以帮助减轻痛苦。它们有很多辅助方法,例如检查对象类型、数组、对象字面量等。
关于javascript - 如何让 JavaScript 代码更防弹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37954999/