以不同的顺序绑定参数

时间:2014-08-14 02:19:11

标签: javascript arguments currying

说我有

function bake(egg, milk, batter) { ... }

我已经吃了鸡蛋。然后我可能会这样做

var f = bake.bind(null, theEgg);

创建一个完成其余工作的函数。

但是:如果我有牛奶或面糊,我想绑定它,它是第一个参数,将在以后传递?有没有一种功能性的方法来扭曲参数而不仅仅创建一个匿名中间函数并手动扭曲参数所以我可以使用参数绑定来获得流畅的,功能正常的代码?

2 个答案:

答案 0 :(得分:2)

我认为你正在寻找具有占位符的部分应用程序。这是一个帮手:

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)

答案 1 :(得分:0)

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

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

bake(ingredients);

然后,您可以更改将鸡蛋,牛奶或面糊添加到ingredients的顺序,并且可以在null方法中处理undefinedbake值。< / p>

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