Javascript 按不同顺序绑定参数

Javascript 按不同顺序绑定参数,javascript,arguments,currying,Javascript,Arguments,Currying,说我有 function bake(egg, milk, batter) { ... } 我已经有蛋了。那么我可能会这么做 var f = bake.bind(null, theEgg); 创建完成其余工作的函数 但是:如果我有牛奶或面糊,我想把它绑起来,这是第一个论点,稍后会被通过,怎么办?有没有一种函数方法可以扭曲参数,而不只是创建一个匿名中间函数并手动扭曲参数,这样我就可以用绑定参数的流畅的函数式代码?使用对象通常是这样做的方法 var ingredients = { egg:

说我有

function bake(egg, milk, batter) { ... }
我已经有蛋了。那么我可能会这么做

var f = bake.bind(null, theEgg);
创建完成其余工作的函数


但是:如果我有牛奶或面糊,我想把它绑起来,这是第一个论点,稍后会被通过,怎么办?有没有一种函数方法可以扭曲参数,而不只是创建一个匿名中间函数并手动扭曲参数,这样我就可以用绑定参数的流畅的函数式代码?

使用对象通常是这样做的方法

var ingredients = {
    egg: theEgg,
    milk: theMilk,
    batter: theBatter
}

bake(ingredients);
然后,您可以改变鸡蛋、牛奶或面糊添加到
配料中的顺序,并且可以在
烘焙
方法中处理
null
未定义的


还有一些库(例如jQuery
extend
)允许您将两个对象合并在一起,因此,例如,您可以拥有一组默认的成分,这些成分是
扩展的
,具有参数中提供的值

,我想您正在寻找带有占位符的部分应用程序。这里有一个助手:

var _ = {} // placeholder

var partial = function(f) {
  var as = [].slice.call(arguments, 1)
  return function() {
    var args = as.concat([].slice.call(arguments))
    for (var i=args.length; i--;)
      if (args[i] === _)
        args[i] = args.splice(-1)[0]
    return f.apply(null, args)
  }
}
然后您可以这样使用它:

partial(bake, _, theMilk, _)(theEgg, theBatter)

在函数式语言中,函数通常是咖喱式的,因此无论如何,您不能立即无序地访问参数。这就是为什么Haskell有像
flip
这样的函数。我会写一些签名,但你用“面糊”作为论据让我有点不安,因为通常“鸡蛋”和“牛奶”都放在面糊里,所以我不想