在Javascript中,我可以使用超过必要数量的参数调用任何方法,并且会默默忽略额外的参数。
e.g。
letters = ['a','b','c']
//correct
letters.indexOf('a')
//This also works without error or warning
letters.indexOf('a', "blah", "ignore me", 38)
有没有办法检测出现这种情况的情况?
我的动机是,根据我的经验,这种情况通常会发生错误。通过代码分析或在运行时识别这些将有助于跟踪这些错误。
这些病例在人们期望改变可能没有发生的基础类型的情况下尤其普遍。在发生这种情况时记录警告
e.g。
Date.parse('02--12--2012', 'dd--MM--YYYY')
注意: 为了清楚起见,我想要一个不涉及我在我的代码和其他人的代码中进行检查的解决方案。
答案 0 :(得分: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;
}
根据已定义的功能,此解决方案完全透明,因此它可能就是您所寻求的。 我强烈建议检查弃用(有一些)和crossbrowser兼容性。
答案 1 :(得分:2)
JavaScript中的函数是对象。因此他们有财产。您可以使用长度MDN属性来实现您想要的功能,该属性指定函数的参数数量预期。
function say ( hello, world ) {
alert (
"arguments length = " + arguments.length + "\n" +
"defined with = " + say.length
);
}
say ( "this ", "brave ", "new ", "world" );
答案 2 :(得分:1)
Javascript是一种非常动态的语言,它的许多有用功能也使得无法静态地进行一些检查。
arguments
隐式对象的存在意味着无法自动确定函数期望所有函数的参数数量。许多var-arg函数都没有声明正式参数,只使用arguments
对象。
你可以做的就是在Cranio建议的每个功能中手动检查它。
如果您想进行自动检查,例如作为单元测试的一部分,您可以使用Function对象的length
属性,该属性返回正式参数的数量。对于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);
答案 3 :(得分:0)
在inside函数中,你可以使用arguments
对象,它包含一个在调用函数时提供给函数的所有参数的数组。
function x(){
return arguments.length;
}
x()
=> 0
x(1,1,1,1,1,1,1,1,1)
=> 9