Обратный вызов JS с использованием map () с функцией, имеющей один дополнительный параметр [duplicate]

This question already has an answer here:

Pass an extra argument to a callback function 4 answers

Я пытаюсь найти способ использовать JSArray.prototype.map() функциональность с функцией, у которой есть еще один дополнительный параметр (если вообще возможно, и я бы хотелavoid необходимость переписать встроенныйArray.prototype.map()). This documentation is very good, but does not cover the "one-or-more-additional-parameter" case:

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

Все идет нормально. Но что, если функция имеетtwo параметры, такие как е. г. флаг, который вы, возможно, захотите ИЛИ (подумайте о битовых масках)

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!

Любые решения должны делатьwithout for петли, конечно, потому что именно поэтому мы имеемmap(), чтобы сделать наш код чище, избавляясь от них!

Ответы на вопрос(4)

A.map(function(a) {return doOpSingle2(a,theFlag);});
 UltraInstinct03 июн. 2012 г., 19:24
+ 1, понял после публикации моего ответа
 syntaxerror03 июн. 2012 г., 22:29
TY! Скорее всего, это единственный способ решить эту задачу (кроме bind ()). Спасибо и другим ответчикам.

Используйте анонимную функцию.

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

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

theFlag будет первым аргументом:

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

 syntaxerror03 июн. 2012 г., 22:30
Любите эту технику bind (), спасибо!

Неважно, вам не нужно закрытие для этого. Смотрите ответ Эсайлии.

Есть другой вариант, если вы используете Закрытая библиотека. Сначала вы должны переписать 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);
}

В этом конкретном случае я бы, вероятно, не рекомендовал бы такой подход, но могут быть подобные ситуации, когда он работает хорошо.

 syntaxerror03 июн. 2012 г., 22:27
Это самая проблема. Было бы излишним использовать внешнюю библиотеку для этой маленькой проблемы. Но все равно спасибо за такой подход. В Реального большой проект, мне может понадобиться эта техника когда-нибудь. ;)
 Esailija03 июн. 2012 г., 19:33
javascript уже может делать карри с.bind хот
 MatrixFrog04 июн. 2012 г., 04:07
Вот почему я сказал: «если вы используете Closure» вместо «вы должны отбросить все прямо сейчас и начать использовать Closure», как это происходит некоторые люди делают;).

Ваш ответ на вопрос