Javascript 将带有参数的函数作为参数传递并检索数据

Javascript 将带有参数的函数作为参数传递并检索数据,javascript,function,Javascript,Function,各位早上好, 因此,我有一个相当令人困惑的问题,所以我将尽可能清楚,并保持简洁 假设我有一个函数basicFunctionbasicFunction有两个参数funcWithParams和callback basicFunction(funcWithParams, callback){ . . . // do stuff here } funcwIthParams正是它所说的,一个带参数或不带参数的函数,参数callback是一个在basicFunction的初

各位早上好,

因此,我有一个相当令人困惑的问题,所以我将尽可能清楚,并保持简洁

假设我有一个函数
basicFunction
basicFunction
有两个参数
funcWithParams
callback

basicFunction(funcWithParams, callback){
    .
    .
    .
    // do stuff here
}
funcwIthParams
正是它所说的,一个带参数或不带参数的函数,参数
callback
是一个在
basicFunction
的初始部分完成时触发的函数

鉴于以上所述,我的问题是。传递带参数的函数时,是否可以获取函数名本身、随其传递的每个参数以及每个传递参数的值?我知道你可以得到一个字符串形式的函数名,但是我不确定每个函数的参数和值

在过去的三天里,我一直在疯狂地研究这个问题,我相信有办法,但我还没有找到答案

示例

function basicFunction(funcWithParams, callback){
     // create a loop to go through and log each of the parameters in the first argument's function

}

function somethingElse(param1, param2, param3){

}

function callbackFunction(){
   alert("I did stuff");
}

basicFunction(somethingElse(param1, param2, param3), callbackFunction);

我想你可能正在寻找一种通常被称为“部分应用”或“咖喱”的东西(以数学家哈斯克尔·咖喱的名字命名)

JavaScript没有纯咖喱(内置;易于添加),但有
函数#bind
,它允许您基于另一个函数创建一个函数,当调用该函数时,该函数将使用特定的
值和您给出的任何参数调用原始函数。如果您不关心
这个
,只需使用
null
。这很清楚,让我们举个例子:

函数foo(a,b){ log(a+“,”+b); } foo(1,2);//"1, 2" //创建咖喱版本 var bar=foo.bind(null,100); //叫咖喱版 巴(200);//“100200”

如果使用的是类的实例,则可能需要考虑上下文。在这种情况下,绑定是有意义的。例如:

function Sum() {
  this._total = 0;
  this.addTen = this.add.bind(this, 10);
}

Sum.prototype.add = function(amount) {
  this._total += amount;
  return this;
};

Sum.prototype.toString = function() {
  return '' + this._total;
};

var sum = new Sum();
sum.addTen().addTen();
console.info(sum);
// 20
但是,在实例之外,通常不需要上下文,更合适的curry形式可能是创建工厂函数,如下所示:

function createAdder(amount1) {
  return function AddTo(amount2) {
    return amount1 + amount2;
  };
}

var addTenTo = createAdder(10);
var fifty = addTenTo(40);

console.info(fifty);
// 50

这通常归结为实现细节和偏好。这两种方法都有很好的用途和参数。

为了弄清楚,您询问是否可以将函数
funcWithParams
作为参数传递到
basicFunction
,该参数本身已预填充参数,但尚未调用?您的意思有点不清楚“是否有可能实际传递带参数的函数”-您能否通过一个示例来说明这一点?funcWithParams基本上是一个指向函数的指针?您是否有可能执行
basicFunction(func(a,b,c),回调)
?如果没有,您如何传入带有参数的函数?@MarkHill:我不确定还有什么需要解释。
f(1)
使用参数
1
调用函数
f
f(1,2,3)
,您立即调用函数,没有任何中间对象将函数
f
与参数
1,2,3
绑定在一起(这就是
f.bind(null,1,2,3)
所做的)。这几乎是我正在尝试做的,但我看到的是类似于
bar(foo(1,2),100);
,并由此得到“foo”的结果“作为字符串,以及1和2的值。@MarkHill:我已经更新了答案。听起来你不想
bind
。为什么bind在实例之外不合适?@Blender:不能代表Rowland,但使用bind进行curry操作的一个问题是,它会干扰
,迫使你在绑定时选择
是什么,而不是在调用函数时。这就是为什么我有一个
函数#curry
我添加到
函数中。原型
通过
不变。我们还可以从罗兰德的例子中推断出,他基本上是说,制作一种特定的咖喱比使用普通的咖喱更好
createAdder
创建一种特定类型的curried函数。@Blender:正如TJ所提到的,绑定迫使开发人员在绑定时而不是在调用时选择上下文。这里也有很多个人意见。后一种形式的curry是跨语言函数式编程中更常见的方法(Bind对于JS来说是非常独特的)。我觉得这一点过于强烈,因为“没有上下文的绑定总是错误的”,这并不是我的本意。我主要想指出,咖喱还有另一种方法。我将更新我的答案以反映这一点。