Javascript: возвращаемая функция с предопределенными аргументами

У меня есть функция вроде

function a (p1, p2) { /* ... */ }

и в какой-то области хотите получить что-то вроде этого:

function b (/* no params! */) { return a (my1, my2) }

где my1 и my2 каким-то образом определены в этой области. Поэтому я должен получить безпараметрическую функцию b, которая при вызове вызывает a с фиксированными параметрами my1 и my2. Теперь, вопрос в том, почему это неправильно, и который:)

UPD: Хорошо, у меня были некоторые обратные вызовы в этих параметрах, теперь выяснилось, как обрабатывать их все. То, что я пропустил, это применить технику дважды. Спасибо.

Ответ 1

Просто создайте функцию, которая возвращает новую функцию b:

function getB(my1, my2) {
  return function() {
    a(my1, my2);
  }
}

и используйте его следующим образом:

var b = getB(my1, my2);

Ответ 2

Напишите функцию, которая принимает my1 и my2 и создает функцию b:

function make_b(my1, my2){
   return function b(){ return a(my1, my2);};
}

Ответ 3

Почему это не так? Вы получаете сообщение об ошибке? Я попытался воспроизвести рабочий образец на основе вашего описания и того, что у меня есть, поэтому, возможно, вы можете разместить более подробный пример:

<script>

function a(p1, p2)
{
 return 'hello ' + p1 + ' and ' + p2;
}
function b(my1,my2)
{
 return function()
        {
          return a(my1,my2);
        }
}

var wrapper=b();
alert(wrapper());
</script>

Изменить

На основе вашего комментария к другому ответу я обновил свой пример, чтобы показать, как вы можете обернуть функцию.

Изменить 2

Хорошо, поэтому я заменил их на переменные; -)

Ответ 4

Я не уверен, правильно понял ли вы, но вы можете взглянуть на концепцию currying. В Javascript можно закрепить функцию, чтобы вы могли получить другую функцию с некоторыми или всеми параметрами, заданными.

Вы можете посмотреть реализацию здесь.

Если вы используете Prototype, вы можете получить функцию b таким образом.

var b = a.curry(arg1, arg2);

теперь вызов b() совпадает с вызовом a(arg1, arg2)

Ответ 5

Поместите значения в массив (или JSON) и верните массив.

function a (p1,p2) { 
   var my = []
   my[0] = p1
   my[1] = p2
   return my
}

function b () {
    return a(my1,nmy2)
}

Возможно, мне не хватает точки в вашем примере, я не знаю.

Ответ 6

Кажется, что три части:

Определение:

  function a(M, N) {
    return M + N;
  }

Определение b:

  var X = 10;
  var Y = 25;
  var b = function() {
   return a(X, Y);
}

Использование b:

  var thirtyFive = b(); // thirtyFive = 35

Ответ 7

В этом примере используется назначение обработчика события onclick во время загрузки страницы, чтобы продемонстрировать, как создать функцию ссылка, содержащая встроенные ссылки на локальные значения в функции настройки.

<html>
<head>
<title>Scope passing Test</title>
<script type="text/javascript">
// Your target function
function a(p1,p2)   {   alert("p1="+p1+ " p2="+p2); }


function yourSetupFunction()
    {
// Declare some local variables that your "a()" function cannot see to test.
var my1 ="Look Ma"  ;
var my2 ="No hands" ;

//  Snag a reference to the <a id="testA"></a> element  
var oAelement=document.getElementById("testA");

oAelement.addEventListener( "click"     ,
                (function(scopePass_My1,scopePass_My2)
                        {
                        return  function()
                            {
                            a(scopePass_My1,scopePass_My2)
                            }
                })(my1,my2) ,true);
    }
</script>
</head>
<body onload="yourSetupFunction()">
<a id="testA" href="#" onclick="return false;">Click to Test</a>
</body>
</html>

Фактическая магия - всего несколько строк

(function(scopePass_My1,scopePass_My2)
            {
            return  function()
            {
                a(scopePass_My1,scopePass_My2)
            }
    })(my1,my2)

Первый набор символов parens вызывает оценку содержимого для ссылки на функцию.

Второй набор парен... (my1, my2)... вызывает вызов функции который возвращает другую функцию, которая может видеть параметры, переданные в ... scopePass_My1, scopePass_My2... и может передать их вашей целевой функции a (p1, p2)

Надеюсь, что это поможет.