首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lodash.js部分在function.apply上的应用

lodash.js部分在function.apply上的应用
EN

Stack Overflow用户
提问于 2014-03-12 20:27:27
回答 3查看 2.5K关注 0票数 5

给定以下函数,_.partial函数的使用会引发一个错误:

代码语言:javascript
复制
function foo(x, y) { return 1 + 2; }
p = _.partial(foo.apply, null);
p([1,2]);

我得到:

TypeError:在对象窗口上调用Function.prototype.apply,它是一个对象,而不是一个函数。

我在这里做错了什么?还有别的方法可以达到我所做的事吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-12 20:34:03

我相信你的目的是:

代码语言:javascript
复制
function foo(x, y) { return x + y; }
p = Function.apply.bind(foo, null);
p([1,2]); // ===3

我能做的最接近的下划线是通过_.bind:

代码语言:javascript
复制
function foo(x, y) { return x + y; }
p = _.bind(foo.apply, foo, 0);
p([1,2]); // ===3

您还可能需要考虑另一种灵活使用该函数的方法,将整个数组中的两个以上的元素加在一起:

代码语言:javascript
复制
 function foo(x, y) { return x + y; }
_.reduce([1,2,3,4,5], foo); // == 15

或者使用vanillaJS:

代码语言:javascript
复制
function foo(x, y) { return x + y; }
[1,2,3,4,5].reduce(foo); // == 15
票数 3
EN

Stack Overflow用户

发布于 2014-04-07 13:37:53

冒着误解这个问题的风险,我想和大家分享我在类似情况下偶然遇到的一种策略。

问题:

问题是,在我的例子中,有时我需要调用带有一些参数的函数(foo),而不需要更改this上下文。不幸的是,参数列表并不是确定性的--有时可能有2,有时可能有3,等等。由于_.partial期望每个参数作为一个单独的参数传递,所以我最初遇到了困难。例如:

代码语言:javascript
复制
// 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来正常调用函数时,这是相同的用例。因此,在闲逛了一段时间后,我意识到我可以这样做:

代码语言:javascript
复制
var argsToLodashPartialFn = [foo].concat(args);
var newFn = _.partial.apply(null, argsToLodashPartialFn);

tldr;

或者,更简单地说:

代码语言:javascript
复制
var newFn = partialApply(foo, args);

// === newFn(args[0], args[1], ...., args[n])
newFn();

下面是一个可重用函数的实现:

代码语言:javascript
复制
/**
 * 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));
}
票数 3
EN

Stack Overflow用户

发布于 2015-05-25 14:54:52

从function 3.2开始,您将使用扩散()函数来完成以下操作:

代码语言:javascript
复制
function foo(x, y) { return x + y; }
var p = _.spread(foo);
p([ 1, 2 ]); // → 3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22363051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档