是的,请正确阅读。上次我在 JavaScript(函数)中看到了不同的参数验证模式,并想知道其中哪一个是最佳实践。首先,我将展示两个示例代码片段。第一个显示(用我的话来说)“立即”参数/条件验证,第二个显示“延迟”验证。它们中的每一个都以不同的方式影响后续代码的外观。到目前为止,我一直使用“立即”验证。但慢慢地,我开始怀疑将以下整个代码强制放入这样的条件 block 中是否合理。请告诉我您的想法以及“最佳”模式是什么。
那么声明变量的地方呢?我有几次读到,所有变量都应该在实际使用之前在方法上声明。它是否正确?因为我认为在确定变量将被实际使用之前声明变量是没有用的(也许无效的参数会强制抛出异常),所以我将变量声明部分移到了参数/条件验证部分之外。这是否可取?
谢谢!
第一个例子:
if ( colorStops.constructor === Array
&& colorStops.length
&& colorStops.every(function(c) {
return c instanceof ColorStop
}))
{
var privateVar1 = "foo",
privateVar2 = "bar",
privateVar3 = "tutifrutti";
// here goes the code
}
else {
throw new TypeError("GradientCanvasFacade: cannot add Colors; " +
"invalid arguments received");
}
第二个例子:
if (cg instanceof ColorGradient) {
throw new TypeError("PresetManager: Cannot add preset; " +
"invalid arguments received");
}
var privateVar1 = "foo",
privateVar2 = "bar",
privateVar3 = "tutifrutti";
// here goes the code
// Here goes the code that get executed when no explicit
// return took place ==> all preconditions fulfilled
最佳答案
由于 JavaScript 变量的作用域为声明函数,而不是像大多数其他语言那样为 block ,因此在函数开头声明变量很有意义。
function someFunc()
{
if (1==1)
{
var x = 1;
}
else
{
var x = 2;
}
return x
}
现在想象一个更复杂的函数,至少对我来说,在开头声明 x 很有意义。对于通常绑定(bind)到 block 的变量(如迭代器变量或集合),我仍然在 block 中声明它们。
我肯定会选择你的第二个例子,不是因为它更早失败,因为实际上它没有失败,而是因为这样更容易删除和添加验证,而不会破坏复杂的 if 结构。
关于javascript - 在 JavaScript 中哪里执行参数验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1429857/