代码之家  ›  专栏  ›  技术社区  ›  petabyte

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

  •  1
  • petabyte  · 技术社区  · 15 年前

    谢谢

    第一个例子:

    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
    
    3 回复  |  直到 15 年前
        1
  •  1
  •   Martijn Laarman    15 年前

    由于JavaScript变量的作用域是声明函数,而不是像大多数其他语言那样是块,所以在函数的开头声明变量是很有意义的。

    function someFunc()
    {
        if (1==1) 
        {
            var x = 1;
        } 
        else 
        {
            var x = 2;
        } 
        return x
    }
    

    我肯定会选择第二个例子,不是因为它之前失败了,而是因为它确实没有失败,而是因为这样删除和添加验证更容易,而不会破坏复杂的if结构。

        2
  •  0
  •   JasonWoof    15 年前

    我会选择第二个,因为它更容易阅读。另外,对于第一个,如果你的函数很长,有人看着底部,会想知道那是什么 } 是为了,必须跳到山顶才能看到。

    此外,变量的作用域也非常清楚,即使对于忘记javascript有奇怪的作用域规则的人来说也是如此。

    另外,正如Martijn所提到的,第二种方法使检查各种错误变得更加容易,即每个错误都有自己的错误 if 声明等等。

        3
  •  0
  •   Rodrigo    15 年前
    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之后还是最后一个if之后?

    第二种选择似乎更具可读性