Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 查找高阶函数包含的参数_Javascript - Fatal编程技术网

Javascript 查找高阶函数包含的参数

Javascript 查找高阶函数包含的参数,javascript,Javascript,我有一个接受函数作为参数的函数。 此回调函数最多可以接收5个参数。其中任何一个在某个点上都可以为null 我尝试访问arguments属性,但它引发以下错误: 不能在严格模式下访问“调用者”、“被调用者”和“参数”属性。 是否可以找到此函数接收的参数?所以我不必每次都通过5级考试 function bar(callback){ // do some stuff return callback(first, second, third, fourth, fifth) } 我有一些用例:

我有一个接受函数作为参数的函数。 此回调函数最多可以接收5个参数。其中任何一个在某个点上都可以为null

我尝试访问arguments属性,但它引发以下错误: 不能在严格模式下访问“调用者”、“被调用者”和“参数”属性。

是否可以找到此函数接收的参数?所以我不必每次都通过5级考试

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这仍然不是您在问题中要问的问题。对于更新后的问题,这个答案仍然正确,为什么不简单地将值作为对象传递呢?是的。我认为只做其他功能更值得。非常感谢。