function validateArguments(args)
{
if(args.length < 1 && args.length > 2)
{
throw new RangeError("Invalid amount of arguments. Follow the syntax");
}
if(typeof args[0] !== "object")
{
throw new TypeError("Invalid first argument type. Follow the syntax");
}
if(args[1] && typeof args[1] !== "function")
{
throw new TypeError("Invalid second argument type. Follow the syntax");
}
return true;
}
我正在尝试解决的是args[1]
,如果它是一个函数,也可以获取参数列表。这可能吗?基本上,这是一个示例代码。
someFunction({ object:"//object" },function(data,datas,dataCall){
//is data, datas, and dataCall too many arugments.
//if so how to throw the error here
});
答案 0 :(得分:1)
你的args
只是第一个参数。有一个特殊的arguments变量,它捕获传递给函数的所有给定参数。您可以像这样使用它:
function myFunction () {
if (arguments.length < 1 || arguments.length > 2)
throw new RangeError("Invalid amount of arguments. Follow the syntax")
if (typeof arguments[0] !== "object")
throw new TypeError("Invalid first argument type. Follow the syntax")
if (typeof arguments[1] !== "function")
throw new TypeError("Invalid second argument type. Follow the syntax")
// do stuff
}
我不确定你问的是什么。如果你想在其他函数中使用你的validateArguments
函数来检查它们的参数,你可以通过将它们的arguments
对象/数组(类似于数组)传递给检查器来实现:
function someFunction () {
validateArguments(arguments)
// do stuff
}
我不明白你最后的回调是什么意思。如果你想限制参数,回调函数将会让你失去运气。您不能对函数声明施加限制(如果您不是自己编写),但是您可以控制传递给它们的内容,所以......
答案 1 :(得分:1)
我想要解决的是
args[1]
,如果它是一个函数,也可以得到它的参数列表。这可能吗?
有点,但它不是100%可靠。您可以访问该函数的length
property,该函数返回它的arity。例如:
function foo(a, b, c) {
}
foo.length;
// 3
如果要获取参数的名称,可以将函数转换为字符串并提取参数列表,就像in this answer一样。
但是,由于函数可以访问其参数,即使没有正式定义的参数(通过arguments
),这也不是一种可靠的技术。但是没有任何一种方式。
答案 2 :(得分:0)
你可以这样做。
someFunction: function() {
if(validateArguments(arguments)) {
var object = arguments.shift();
var func = arguments.shift();
func.apply(this,arguments);
// Do whatever you want
}
},
您可以使用参数,它将包含所有参数列表。