是的,请正确阅读。在上一次我在JavaScript(函数)中看到了不同的参数验证模式,并想知道哪些是最佳实践。首先,我将展示两个示例代码片段。第一个显示(在我看来)“立即”参数/条件验证,第二个显示“延迟”验证。它们中的每一个都以不同的方式影响以下代码的外观。到目前为止,我总是使用“立即”验证。但是慢慢地我怀疑是否有理由将整个后续代码强制转换为这样的条件块。请告诉我你的想法以及可能是“最佳”的模式。
那么声明变量的地方呢?我读过几次,在实际使用它们之前,应该在方法上声明所有变量。它是否正确?因为我认为在确定它们确实被实际使用之前声明变量是没用的(可能是无效的参数强制抛出异常),我将变量声明部分移到了参数/条件验证部分之外。这是可取的吗?
谢谢!
第一个例子:
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
答案 0 :(得分:1)
由于JavaScript变量的范围是声明函数而不是像大多数其他语言那样块,因此在函数开头声明变量会有很多意义。
function someFunc()
{
if (1==1)
{
var x = 1;
}
else
{
var x = 2;
}
return x
}
现在想象一个函数要复杂得多,至少对我而言,在开头宣称x有很多意义。对于通常绑定到块的变量(如迭代器变量或集合),我仍然在块中声明它们。
我肯定会选择你的第二个例子,不是因为它早先失败了,因为它实际上没有,但是因为它更容易删除并以这种方式添加验证而不会破坏复杂的if结构。
答案 1 :(得分:0)
我会选择第二个,因为它更容易阅读。另外,第一个,如果你的功能很长,看到底部的人会想知道}
的用途是什么,并且必须跳到顶部才能看到。
变量的范围也非常明确,即使对于忘记javascript具有奇怪范围规则的人也是如此。
另外,正如Martijn所提到的,第二种方法可以更容易地检查各种错误,即每种错误都有自己的if
语句等等。
答案 2 :(得分:0)
if (some condition) {
if (some other condition based in the first) {
if (another condition based in 1st and 2nd) {
do_job();
} else?
} else?
} else?
在哪里放置else块?在每个if之后或之后?
第二次选择似乎更具可读性