看看Underscore的_.partial
:
通过填充任意数量的参数来部分应用函数,而不更改其动态 this 值。您可以在参数列表中传递 _ 来指定不应预先填充的参数,但应保持打开状态以在调用时提供。
在你的情况下:
function foo(arg1, arg2, arg3, arg4) { console.log(arguments); }
foo = _.partial(foo, 'bar', _, 'qux');
foo('baz', 'lel');
> { '0': 'bar', '1': 'baz', '3': 'qux', '4': 'lel'}
是的,我知道这并不完全是你所说的你想要的。你似乎想要both论点被压缩在哪里_
是。除了明确指定在调用时填充两个参数之外,没有什么好的方法可以解决这个问题:
foo = _.partial(foo, 'bar', _, _, 'qux');
我不一定建议您使用它,但至少您可以看一下他们的代码并获得一些提示。
如果你想要预先确定的参数总是出现在最后,比如'qux'
,您将需要一些额外的机械。例如,这里有一个小例程(使用 ES6,但您可以适应),它将函数转换为指定参数放置在参数列表末尾的函数:
function partialEnd(fn, ...predefinedArgs) {
return function() {
return fn.apply(this, [...arguments, ...predefinedArgs]);
};
}
你可以这样使用它:
function foo(a, b, c) { console.log(a + b + c); }
foo = partialEnd(foo, 3);
foo(1, 2) // outputs 6
你可以将其与_.partial
using _
占位符以获得一些参数插入到参数列表中,而其他参数始终放置在末尾的效果:
function foo(arg1, arg2, arg3, arg4) { console.log(arguments); }
foo = _.partial(foo, 'bar', _, _);
foo = partialEnd(foo, 'lel');
foo('baz', 'lel');
> { '0': 'bar', '1': 'baz', '3': 'lel', '4': 'qux'}