关于以下模拟代码(_与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))
或类似的东西可能会起作用,但显然不会。
有什么建议吗?
答案 0 :(得分:6)
您有三种选择:
将functionForEach
放入containerFunction
。如果您不打算在其他地方使用functionForEach
,那么这是最有意义的。
将其写为:
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;
}
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
参数的值始终为2
,item
是映射的集合值。
让我们尝试别的东西:
_.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
。文档:
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
中的参数。