按不同顺序绑定参数

Bind arguments in different order

本文关键字:绑定 参数 顺序      更新时间:2023-09-26

假设我有

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

我已经有鸡蛋了。然后写入

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

创建一个函数来完成剩下的工作。

但是:如果我有牛奶或面糊,我想绑定它,它是第一个参数,将稍后传入?是否有一种功能性的方法来扭曲参数,而不只是创建一个匿名的中间函数,并手动扭曲参数,这样我就可以有流畅的,函数式的代码与参数绑定?

我认为您正在寻找部分应用程序,带有占位符。下面是一个帮助器:

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)

通常使用对象来实现

var ingredients = {
    egg: theEgg,
    milk: theMilk,
    batter: theBatter
}
bake(ingredients);

然后你可以改变鸡蛋、牛奶或面糊加入ingredients的顺序,你可以在你的bake方法中处理nullundefined的值。

也有库(如jQuery extend),允许你合并两个对象在一起,所以,例如,你可以有一个默认的成分集,extended与参数

提供的值