1

在 Javascript 中,我可以调用任何具有超过必要参数数量的方法,并且额外的参数会被静默忽略。

例如

letters = ['a','b','c']
//correct
letters.indexOf('a')
//This also works without error or warning
letters.indexOf('a', "blah", "ignore me", 38)

有没有办法检测发生这种情况的情况?

我的动机是,根据我的经验,发生这种情况的情况通常是错误。通过代码分析或在运行时识别这些错误将有助于追踪这些错误。

当人们期望对可能没有发生的基本类型进行更改时,这些情况尤其普遍。记录发生这种情况的警告

例如

Date.parse('02--12--2012', 'dd--MM--YYYY')

注意:要清楚,我想要一个不涉及我在我的代码和其他人的代码上撒上检查的解决方案。

4

4 回答 4

2

您可以使用该arguments对象。

function myFunction(param1,param2)
{
   if (arguments.length!=2)
   {
       // wrong param number!
   }
   ...
}

根据您的编辑:如果您想实现自动形式的检查,而无需触及原始功能

您仍然必须使用以下方法处理每个功能:

functionName = debug(functionName, numberOfExpectedArgs);

此操作通过检查参数数量来包装函数。

所以我们保留一个示例函数不变

// this is the original function... we want to implement argument number
// checking without insertint ANY debug code and ANY modification

function myFunction(a,b,c)
{
    return a + " " + b + " " + c;
}

// the only addition is to do this...
myFunction = debug(myFunction,3); // <- implement arg number check on myFunction for 3 args

// let's test it...    
console.log(myFunction(1,2,3));
console.log(myFunction(1,2));

你需要实现这个debug()功能:

function debug(f, n)
{
    var f2 = f;
    var fn = function()
        {
            if (arguments.length!=n) console.log("WARNING, wrong argument number");
            return f2.apply(f2, arguments);
        };
    return fn;
}

​

根据已经定义的功能,这个解决方案是完全透明的,所以它可能是你想要的。我强烈建议检查弃用(有一些)和跨浏览器兼容性。

于 2012-06-17T20:18:33.750 回答
2

JavaScript 中的函数是对象。因此,它们具有属性。你想要的可以通过长度MDN属性来实现,它指定函数期望参数数量

function say ( hello, world ) {
    alert ( 
      "arguments length = " + arguments.length + "\n" +
      "defined with = " + say.length
    );
}
say ( "this ", "brave ", "new ", "world" );​

这甚至适用于 IE8。演示。在你的情况下,你可以做这样的事情

于 2012-06-17T21:49:54.610 回答
1

Javascript 是一种非常动态的语言,它的许多有用功能也使得无法静态地进行一些检查。

隐式对象的存在arguments意味着无法自动确定函数期望所有函数有多少参数。许多 var-arg 函数不声明正式参数并arguments专门使用该对象。

您可以可靠地做的就是像 Cranio 建议的那样在每个功能中手动检查它。

如果您想进行自动检查,例如作为单元测试的一部分,您可以利用lengthFunction 对象的属性,该属性返回形式参数的数量。对于 var-arg 函数,只是不包括检查。例如:

function checkNumberOfArguments(args) {
    if (args.length != args.callee.length) {
        throw new Error('Wrong number of arguments');
    }
};

// Use it like

function a(b) {
    checkNumberOfArguments(arguments);
}

a(1);
a(1,2);
于 2012-06-17T20:41:40.493 回答
0

您可以在函数内部使用arguments对象,它包含一个数组,该数组包含在调用函数时提供给函数的所有参数。

function x(){
  return arguments.length;
}

x()
=> 0
x(1,1,1,1,1,1,1,1,1)
=> 9
于 2012-06-17T20:20:38.397 回答