使用 map() 和一个具有一个附加参数的函数的 JS 回调

JS callback using map() with a function that has one additional parameter

本文关键字:参数 JS 回调 函数 具有一 map 使用 一个 有一个      更新时间:2023-09-26

我正在尝试找到一种方法来将JS的Array.prototype.map()功能与一个具有更多附加参数的函数一起使用(如果可能的话,我想避免重写内置Array.prototype.map())。此文档非常好,但不涉及"一个或多个附加参数"的情况:

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map

function doOpSingle(elem)
{
 // do something with one array element
}
var A = ["one", "two", "three", "four"];
var x = A.map(doOpSingle); // this will execute doOpSingle() on each array element

目前为止,一切都好。但是,如果所讨论的函数有两个参数,例如您可能想要的标志或它(想想位掩码)

function doOpSingle2(arrelem,flag)
{
 // do something with one array element
}
var A = ["one", "two", "three", "four"];
var theFlag = util.getMask(); // call external function
var y = A.map(doOpSingle2(theFlag)); // this does not work!

当然,任何解决方案都应该没有for循环,因为这就是为什么我们有 map() ,使我们的代码更干净,摆脱这些!

使用匿名函数:

A.map(function(a) {return doOpSingle2(a,theFlag);});

A.map(doOpSingle2.bind(null, theFlag))

不过theFlag将是第一个参数:

function doOpSingle2( flag, elem ) { ... }

使用匿名函数。

var y = A.map(function(x){doOpSingle2(x,theFlag);});

编辑:没关系,你真的不需要闭包。参见Esailija的答案。

如果您碰巧使用闭包库,还有另一种选择。首先,您必须重写doOpSingle2,以便标志在第一位:

function doOpSingle2(flag, arrelem)
{
 // do something with one array element
}

然后你可以做

var y = A.map(goog.partial(doOpSingle2, theFlag));

goog.partial 部分应用了该函数,因此goog.partial(doOpSingle2, theFlag)等效于此函数:

function(arrElem) {
  return doOpSingle2(theFlag, arrElem);
}

在这种特殊情况下,我可能不会推荐这种方法,但可能存在类似的情况,它运行良好。