Javascript: функция возврата с предопределенными аргументами - PullRequest
11 голосов
/ 10 марта 2009

У меня есть такая функция, как

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

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

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

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

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

Ответы [ 7 ]

17 голосов
/ 10 марта 2009

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

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

и используйте его так:

var b = getB(my1, my2);
2 голосов
/ 10 марта 2009

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

function make_b(my1, my2){
   return function b(){ return a(my1, my2);};
}
1 голос
/ 10 марта 2009

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

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

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

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

теперь звонить b() - это то же самое, что звонить a(arg1, arg2)

1 голос
/ 10 марта 2009

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

<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

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

0 голосов
/ 07 июня 2011

В этом примере используется назначение обработчика события 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)

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

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

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

0 голосов
/ 10 марта 2009

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

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

  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
0 голосов
/ 10 марта 2009

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

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

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

Может быть, я упускаю суть в вашем примере, я не знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...