2009-03-10 27 views
10

tengo una función comoJavascript: función de retorno con argumentos predefinidos

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

y en cierto margen quieren obtener algo como esto:

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

donde my1 y my2 se definen de alguna manera en este ámbito . Así que debería obtener una función b sin parámetros, que cuando se llama llama a los parámetros fijos my1 y my2. Ahora, la pregunta es por qué esto no está bien, y cuál es :)

UPD: Bien, tenía algunas devoluciones de llamada en esos parámetros, ahora descubrí, cómo procesarlos todos. Lo que extrañé fue aplicar la técnica dos veces. Gracias.

Respuesta

15

simplemente hacer una función que devuelve una función nueva b:

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

y utilizar de esta manera:

var b = getB(my1, my2); 
0

Coloque los valores en una matriz (o JSON) y devuelva la matriz.

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

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

Tal vez me falta el punto en su ejemplo, no sé.

+0

Me parece que me has entendido mal (o tal vez no fui lo suficientemente estricto). Lo que quiero es tener una función1, que tome algunos parámetros, generar una función2, que no tome parámetros y devuelva function1 con algunos parámetros fijos, no constantes, sin duda, deben evaluarse en ese momento – stanch

1

¿Por qué no es así? ¿Estás obteniendo un error? He intentado reproducir una muestra de trabajo en base uno a su descripción y lo que tengo obras así que quizás puede publicar una muestra más detallada:

<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> 

Editar

Basado en su comentario a otra respuesta que actualicé mi muestra a muestra cómo puedes ajustar una función.

Editar 2

Ok, así que los reemplazaron con variables ;-)

+0

el problema es - my1 y my2 no son constantes como en tu ejemplo 'josh' y 'fred'. El debe ser evaluado en el momento de la creación de b. p. 'var v = 'some text'; función b() {return a (v);} ' – stanch

2

Escribir una función que toma my1 y my2 y crea función B:

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

No estoy seguro si entendí bien, pero puede ver un concepto llamado currying. Es posible curry una función en Javascript para que pueda obtener otra función con algunos o todos los parámetros preestablecidos.

Puede ver una implementación here.

Si está utilizando Prototype, puede obtener la función b de esta manera.

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

ahora llamar b() es lo mismo que llamar a(arg1, arg2)

0

Parece que hay tres partes:

Definición de una:

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

b Definición:

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

Usando b:

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

este ejemplo se utiliza la asignación de un controlador de eventos onclick durante carga de la página para demostrar cómo crear una referencia de función contiene referencias incrustados a valores entonces locales en la función de configuración.

<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> 

La magia real es sólo unas pocas líneas

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

el primer conjunto de parens hacen que los contenidos a ser evaluados para una referencia de función.

El segundo conjunto de parens ... (my1, MY2) ... causan la referencia función a ser llamada que devuelve otra referencia de función que puede ver los parámetros pasados ​​en ... scopePass_My1, scopePass_My2 ... y puede pasarlos a su función de destino a (p1, p2)

Espero que ayude.

Cuestiones relacionadas