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
我应该关注它吗?
提前致谢!
答案 0 :(得分:6)
你可能不应该担心。如何处理这样的错误没有全面的规则。它完全取决于错误的类型和情况的类型。在某些情况下,如果它是严重的编程错误并且无法继续(例如执行所需函数的参数不足),则抛出异常或从函数返回错误可能是有意义的。但是,在其他情况下,可以安全地忽略额外的参数,并且您可以继续您的快乐方式,就好像该参数永远不会通过一样。
当你习惯了javascript时,你会发现许多函数参数可以是可选的,并且可以用零,一,二或三或甚至N个参数正确调用单个函数,函数中的代码可以适应适当。这实际上允许您在更多“静态”语言中执行不那么容易的事情。甚至可以适应参数的类型,并根据参数的类型做适当的事情。虽然这对于只有硬类型语言经验的人来说听起来像是异端,但它实际上非常有用。
随着时间的推移你维护一段代码,你也会发现能够在函数定义中添加一个参数,将代码添加到该函数中是很好的,如果它能将其默认为合理的值没有传递,不必更改任何使用该函数的先前代码,但是一些需要新参数的新位置可以立即开始使用它。而不是通过整个代码库来修复该函数的每个调用者,您只需在一个文件中进行一次更改并立即开始使用函数的新参数而不更改所有其他调用者。这非常有用。
因此,在更直接地回答您的问题时,传递给函数的额外参数永远不会是javascript中的严重错误。您的代码可以忽略它并继续。如果你想提醒编写该代码的开发人员传递了一个意外的参数,你可以在函数/库的“debug”版本中以某种方式通知他们(可能是调试控制台上的一些警告文本),但我认为没有理由为什么你应该在你的函数/库的“生产”版本中停止执行,而不会有任何伤害。
答案 1 :(得分:3)
您无需担心这一点。如果传递的参数太多,函数将忽略它。如果 参数太少,您应该只抛出一个错误。在这种情况下,该功能可能无法运行。
答案 2 :(得分:1)
虽然我同意参数的数量并不重要(并且只要你在使用它们之前键入检查你得到的参数,就不会引起问题),因为一个未使用的,未被调用的参数赢了't 做任何事情,如果您特别担心,您可以创建传递参数的子集并在内部访问该对象:
function test(arg1, arg2, arg3) {
var slice = Array.prototype.slice,
subset = slice.call(arguments, 0, 3); // depending on how many arguments you want
}
当然这意味着您现在必须从args
对象中恢复参数,并且由于多余的参数似乎非常安全,这似乎毫无意义。但它仍然是一种选择。
虽然没必要。