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
或未定义的值
还有一些库(例如jQueryextend
)允许您将两个对象合并在一起,因此,例如,您可以拥有一组默认的成分,这些成分是扩展的
,具有参数中提供的值,我想您正在寻找带有占位符的部分应用程序。这里有一个助手:
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
这样的函数。我会写一些签名,但你用“面糊”作为论据让我有点不安,因为通常“鸡蛋”和“牛奶”都放在面糊里,所以我不想