Javascript 查找高阶函数包含的参数
我有一个接受函数作为参数的函数。 此回调函数最多可以接收5个参数。其中任何一个在某个点上都可以为null 我尝试访问arguments属性,但它引发以下错误: 不能在严格模式下访问“调用者”、“被调用者”和“参数”属性。 是否可以找到此函数接收的参数?所以我不必每次都通过5级考试Javascript 查找高阶函数包含的参数,javascript,Javascript,我有一个接受函数作为参数的函数。 此回调函数最多可以接收5个参数。其中任何一个在某个点上都可以为null 我尝试访问arguments属性,但它引发以下错误: 不能在严格模式下访问“调用者”、“被调用者”和“参数”属性。 是否可以找到此函数接收的参数?所以我不必每次都通过5级考试 function bar(callback){ // do some stuff return callback(first, second, third, fourth, fifth) } 我有一些用例:
function bar(callback){
// do some stuff
return callback(first, second, third, fourth, fifth)
}
我有一些用例:
bar((a, b, c) => a + c)
bar((a, b, c, d) => a + c + d)
bar((a, b, c, d, e) => a + b + e)
我总是用5个参数调用回调函数,但有时,并不是所有参数都被使用。对于每一个,我都在做一些计算
另一个例子:
如果我这样调用函数:
bar((a, b, c, d, e) => a + b + e)
function bar(callback){
// do some stuff with
return callback(first, second, third, fourth, fifth)
}
我的函数定义如下:
bar((a, b, c, d, e) => a + b + e)
function bar(callback){
// do some stuff with
return callback(first, second, third, fourth, fifth)
}
我不需要将第三个和第四个参数传递给回调,因为它们是空的。但是,由于我无法访问回调收到的参数,因此我无法执行此操作。您可以获取函数的属性,该属性返回已定义参数的数量
功能栏(回调){
log(callback.length);
}
条((a,b)=>a+b);
bar(函数(a,b,c){console.log(a,b,c);})代码>您可以使用
但是,我不建议编写依赖于此的代码。回调函数可以以不同的方式实现,而这是行不通的。一些例子:
function callback(){
console.log(arguments); // could access all parameters but length is 0
}
function callback(...args){
console.log(args); // could access all parameters but length is 0
}
function callback(a,b=0,c,d,e){
console.log(a,b,c,d,e); // could access all parameters but length is 1
// 1, only parameters before the first one with
// a default value is counted
}
更好的解决方案是根据回调的期望,不使用不同的行为重载函数,并实际告诉您应该“返回”回调的内容
function bar(callback, n){
if(n===0) // do something
else if(n===1) // do something else
}
或者不要编写具有多个行为且实际具有多个函数的“重载”函数:
function foo(callback){
// do some sutff
return callback(first, second)
}
function bar(callback){
// do some sutff
return callback(first, second, third, fourth, fifth)
}
编辑:从上次编辑开始,您应该需要这样的内容
功能栏(参数、回调){
常量对象={
答:1,,
b:2,
c:3,
d:4,
e:5
};
常量args=params.map(p=>obj[p]);
返回callback.apply(此参数为args);
}
log(bar(['a','b'],(a,b)=>a+b))//3
log(bar(['a','d','e'],(a,d,e)=>a+d+e))/10
我编辑了这个问题。我想我没有解释清楚。发生了什么变化?问题不在于争论的长度,而在于争论的顺序。例如,您传递了5个参数(a、b、c、d、e),但我可能不需要b和d。然后我不明白“所以我不必每次都传递5个参数?”。您至少需要使用的参数数。也许包装器函数或函数的属性(需要实现)具有此信息。@Glund这仍然不是您在问题中要问的问题。对于更新后的问题,这个答案仍然正确,为什么不简单地将值作为对象传递呢?是的。我认为只做其他功能更值得。非常感谢。