在JavaScript中传递给函数的参数量

Sem*_*ble 2 javascript

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
Run Code Online (Sandbox Code Playgroud)

我应该关注它吗?

提前致谢!

jfr*_*d00 6

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

当你习惯了javascript时,你会发现许多函数参数可以是可选的,并且可以使用零,一,二或三或甚至N个参数正确调用单个函数,并且函数中的代码可以适当地调整.这实际上允许您在更多"静态"语言中执行不那么容易的事情.甚至可以适应参数的类型,并根据参数的类型做适当的事情.虽然这对于只有硬类型语言经验的人来说听起来像是异端,但它实际上非常有用.

随着时间的推移你维护一段代码,你也会发现能够在函数定义中添加一个参数,将代码添加到该函数中是很好的,如果它不是,则将其默认为合理的值传递并且不必更改任何使用该函数的先前代码,但是一些需要该新参数的新位置可以立即开始使用它.而不是通过整个代码库来修复该函数的每个调用者,您只需在一个文件中进行一次更改并立即开始使用函数的新参数而不更改所有其他调用者.这非常有用.


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