向函数调用(lodash)传递附加参数

Passing additional arguments to function call (lodash)

本文关键字:参数 函数调用 lodash      更新时间:2023-09-26

与以下模拟代码有关(_与lodash库有关):

var containerFunction = function () {
    var opts = {data: value};
    _.map(lines, functionForEach);
}
var functionForEach = function (line) {
  Do something for each line passed in from the maps function.
  Need to access opts in this scope.
  return value;
}

参数行是从map函数接收的,但将opts参数传递给functionForEach函数的最佳方式是什么,同时保持上面的粗略模式(如果可能的话)。

我想的是:

_.map(lines, functionForEach(opts))

或者类似的东西可能会起作用,但显然不会。

有什么建议吗?

您有三种选择:

  1. functionForEach放入containerFunction中。如果你不打算在其他地方使用functionForEach,这是最有意义的。

  2. 写为:

    var containerFunction = function () {
      var opts = {data: value};
      _.map(lines, function(elt) { return functionForEach(elt, opts); });
    }
    var functionForEach = function (line, opts) {
      Do something for each line passed in from the maps function.
      Need to access opts in this scope.
      return value;
    }  
    
  1. 如果必须,请将opts作为第三个(thisArg)参数传递给_.map,并使用functionForEachvar中的this访问它

Lodash在函数组合方面有很好的实用程序,包括部分应用参数。然而,这实际上并不是那么简单。假设我们想要使用partialRight():

function functionForEach(item, i) { return item * i; }
_.map([1, 2, 3], _.partialRight(functionForEach, 2));
// → [0, 2, 6]

哎呀。这是不对的。原因是我们没有像预期的那样将参数传递给functionForEach()。我们希望i参数的值始终为2,而item是映射的集合值。

让我们试试其他东西:

_.map([1, 2, 3], _.ary(_.partialRight(functionForEach, 2), 1));
// → [2, 4, 6]

这样更好。问题是map()将该项作为第一个参数传递,同时传递另外两个参数(索引和集合本身)。由于我们不关心后两个参数,我们可以使用ary()来编写一个忽略它们的新函数。

这是另一种方法:

_.map([1, 2, 3], _.partial(_.rearg(functionForEach, 1, 0), 2));
// → [2, 4, 6]

这一次,我们使用rearg()来更改partial()函数参数的顺序。我发现这种方法不如partialRight()的简单方法直观。

最后一个例子:

_.map([1, 2, 3], _.flow(_.identity, _.partialRight(functionForEach, 2)));
// → [2, 4, 6]

在这里,我们使用flow()高阶函数来组成回调。这个函数接受提供给它的参数,并将我们传递给它的函数链接在一起——上一个函数的输出是下一个函数。我们在这里使用identity()函数,因为它只是返回传递给它的第一个参数,这正是我们想要的。

最后一种方法类似于ary()方法——它在做同样的事情。如果我们希望通过在functionForEach()之前或之后传递更多函数来建立这种行为,那么flow()方法是优越的。

看看_.partial。文件:

部分

var containerFunction = function() {
  var opts = { data: value };
  _.map(lines, _.partial(functionForEach, opts));
};
var functionForEach = function (opts, line) { ... };

_.partial返回一个新函数,该函数的参数在函数ForEach之前。在上面的例子中,_.partial返回以下函数签名:

function (line) { ... }

用行调用return函数用行调用functionForEach,并选择默认值为_.partial中作为参数传入的值。