给定以下函数,_.partial函数的使用会引发一个错误:
function foo(x, y) { return 1 + 2; }
p = _.partial(foo.apply, null);
p([1,2]);我得到:
TypeError:在对象窗口上调用Function.prototype.apply,它是一个对象,而不是一个函数。
我在这里做错了什么?还有别的方法可以达到我所做的事吗?
发布于 2014-03-12 20:34:03
我相信你的目的是:
function foo(x, y) { return x + y; }
p = Function.apply.bind(foo, null);
p([1,2]); // ===3我能做的最接近的下划线是通过_.bind:
function foo(x, y) { return x + y; }
p = _.bind(foo.apply, foo, 0);
p([1,2]); // ===3您还可能需要考虑另一种灵活使用该函数的方法,将整个数组中的两个以上的元素加在一起:
function foo(x, y) { return x + y; }
_.reduce([1,2,3,4,5], foo); // == 15或者使用vanillaJS:
function foo(x, y) { return x + y; }
[1,2,3,4,5].reduce(foo); // == 15发布于 2014-04-07 13:37:53
冒着误解这个问题的风险,我想和大家分享我在类似情况下偶然遇到的一种策略。
问题:
问题是,在我的例子中,有时我需要调用带有一些参数的函数(foo),而不需要更改this上下文。不幸的是,参数列表并不是确定性的--有时可能有2,有时可能有3,等等。由于_.partial期望每个参数作为一个单独的参数传递,所以我最初遇到了困难。例如:
// some dynamic array of args
var args = [new Error(), [{id: 3}, {id: 7}], function cb() {}];
// the function we want the partially applied to
var fn = function foo ( /* ...want `args` in here... */ ) {
// ..implementation...
}
// can't do it with normal _.partial() usage...
// var newFn = _.partial(fn, args[0], args[1], ... args[args.length])解决方案:
当您想要使用apply而不是call来正常调用函数时,这是相同的用例。因此,在闲逛了一段时间后,我意识到我可以这样做:
var argsToLodashPartialFn = [foo].concat(args);
var newFn = _.partial.apply(null, argsToLodashPartialFn);tldr;
或者,更简单地说:
var newFn = partialApply(foo, args);
// === newFn(args[0], args[1], ...., args[n])
newFn();下面是一个可重用函数的实现:
/**
* partialApply()
*
* Like `_.partial(fn, arg0, arg1, ..., argN)`,
* but for a dynamic array of arguments:
*
* @param {Function} fn
* @param {Array} args
* @return {Function}
*/
function partialApply (fn, args) {
return _.partial.apply(null, [fn].concat(args));
}发布于 2015-05-25 14:54:52
从function 3.2开始,您将使用扩散()函数来完成以下操作:
function foo(x, y) { return x + y; }
var p = _.spread(foo);
p([ 1, 2 ]); // → 3https://stackoverflow.com/questions/22363051
复制相似问题