2

JavaScript 对我来说是一个启示。我以为它会像另一种经典语言,如 C#、Java 等。但事实并非如此。“动态世界”是艰难而难以预测的。当我读到函数可以接收任意数量的参数时,我感到很惊讶。没有任何错误!我一点也不喜欢。我想要更多的“静态”,我想要某种编译时错误!

我的问题是:我需要担心吗?如果传递的参数数量超过特定函数的预期,抛出异常是一种好习惯吗?

function foo(one, two, three)
{
    // Is it good?
    if(arguments.length > arguments.callee.length)
        throw new Error("Wrong quantity of arguments in " + arguments.callee.name + "()");

    /* Stuff */
}

foo(1, 2, 3, 4); // -> Error
foo(1, 2, 3);    // -> OK

我应该担心吗?

提前致谢!

4

3 回答 3

6

你可能不应该担心。没有关于如何处理此类错误的一揽子规则。这完全取决于错误的类型和情况的类型。在某些情况下,如果这是一个严重的编程错误并且无法继续进行(例如执行所需功能的参数不足),抛出异常或从函数返回错误可能是有意义的。但是,在其他情况下,可以安全地忽略额外的参数,并且您可以继续愉快地进行,就好像该参数从未通过一样。

当你习惯了 javascript,你就会明白许多函数参数可以是可选的,一个函数可以用零个、一个、两个或三个甚至 N 个参数正确调用,并且函数中的代码可以适当地适应。这实际上允许您做一些在更“静态”的语言中不容易做到的事情。甚至可以适应参数的类型,并根据参数的类型适当地做一些事情。虽然这对于只有硬类型语言经验的人来说听起来像是异端,但它实际上非常有用。

随着时间的推移,您会维护一段代码,您还会发现能够将参数添加到函数的定义中是件好事通过并且不必更改任何使用该函数的先前代码,但是一些需要该新参数的新地方可以立即开始使用它。与其遍历整个代码库来修复该函数的每个调用者,不如只在一个文件中进行一次更改,然后立即开始使用该函数的新参数,而无需更改所有其他调用者。这非常有用。


因此,在更直接地回答您的问题时,传递给函数的额外参数绝不是 javascript 中的严重错误。您的代码可以忽略它并继续。如果您想提醒编写该代码的开发人员传递了意外的参数,您可以在函数/库的“调试”版本中以某种方式通知他们(可能是调试控制台上的一些警告文本),但我看不出任何原因为什么你应该在你的函数/库的“生产”版本中停止执行,而你可以在没有任何伤害的情况下继续执行。

于 2012-10-22T22:01:58.787 回答
3

你不需要担心这个。如果您传递太多参数,该函数将忽略它。如果参数太少,您应该只抛出错误。在这种情况下,该功能可能无法运行。

于 2012-10-22T22:01:38.813 回答
1

虽然我同意参数的数量并不重要(只要你在使用它们之前对你得到的参数进行类型检查就不会导致问题),因为一个未使用的、未调用的参数是行不通的任何东西,如果您特别担心,您可以创建传递参数的子集并在内部访问该对象:

function test(arg1, arg2, arg3) {
    var slice = Array.prototype.slice,
        subset = slice.call(arguments, 0, 3); // depending on how many arguments you want
}

当然,这意味着您现在必须从args对象中恢复参数,并且由于多余的参数似乎是完全安全的,这似乎毫无意义。但这仍然是一种选择。

虽然没有必要。

于 2012-10-22T22:15:05.587 回答