javascript - 在 JavaScript 中哪里执行参数验证?

标签 javascript validation parameters arguments

是的,请正确阅读。上次我在 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/

相关文章:

javascript - React 组件中的 Clipboard.js 出现错误?

c++ - 函数参数已在函数声明 C++ 中初始化

javascript - window.location 不会使用参数重新加载

javascript - 我正在 React 创建一个聊天机器人我需要它的一些特定回复而不是单个关键字匹配

javascript - JQuery Range Slider 如何让多个标 checkout 现?

java - 验证java中某些值的整数

c++ - 如何在可移植代码中验证 Microsoft 可移植可执行格式的数字签名?

c++ - 将代码从 gcc 移植到 clang

JavaScript 侧边栏滑动菜单

ruby-on-rails - Rails、Devise、Validatable 不起作用?