将其他参数传递给函数调用(lodash)

时间:2015-12-22 16:57:38

标签: javascript scope lodash

关于以下模拟代码(_与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))

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

有什么建议吗?

3 个答案:

答案 0 :(得分:6)

您有三种选择:

  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,并使用this内的functionForEachvar访问它。

答案 1 :(得分:4)

Lodash具有良好的功能组合功能,包括部分应用参数。然而,这实际上并不那么简单。假设我们想要使用MDN

function functionForEach(item, i) { return item * i; }

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

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

让我们尝试别的东西:

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

那更好。问题是partialRight()将项目作为第一个参数传递,还有另外两个参数(索引和集合本身)。由于我们不关心后两个参数,我们可以使用map()组成一个忽略它们的新函数。

这是另一种方法:

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

这一次,我们使用ary()来更改rearg()函数参数的顺序。我发现这种方法不如直接适用partialRight()那么直观。

最后一个例子:

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

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

这最后一种方法类似于ary()方法 - 它正在做同样的事情。如果我们想要在flow()之前或之后传入更多函数来构建此行为,那么functionForEach()方法就更胜一筹。

答案 2 :(得分:3)

看看_.partial。文档:

partial

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

var functionForEach = function (opts, line) { ... };

_.partial返回一个新函数,其参数前置于functionForEach。在上面的示例中,_.partial返回以下函数签名:

function (line) { ... }

使用行调用return函数调用functionForEach,并使用line和opts默认为传入的_.partial中的参数。