2011-09-04 17 views
15

Duplicar posible:
Is it possible to send a variable number of arguments to a JavaScript function?Pasando número variable de argumentos de una función a otra

puedo usar arguments para obtener un número variable de argumentos dentro de una función, pero ¿cómo puedo pasarlos a otra función sin conocer su prototipo?

function show(foo, bar) { window.alert(foo+' '+bar); } 
function run(f) { f(arguments); } // not correct, what to do? 
run(show, 'foo', 'bar'); 

Nota: No puedo garantizar que el número de argumentos necesarios para la función f que se pasa a run. Es decir, a pesar de que el ejemplo mostrado tiene 2 argumentos, podría ser 0-infinito, por lo que el siguiente no es apropiada:

function run(f) { f(arguments[1], arguments[2]); } 
+0

no estoy de acuerdo, como se puede ver, 'show' ha definido argumentos, que no utiliza' arguments'. Ya he intentado 'aplicar' de esa manera sin suerte. – steveo225

+0

Bueno, como habrás notado hasta ahora, 'apply' es la única forma de hacerlo, por lo tanto * es * un duplicado. –

+0

Sí, excepto que la forma en que 'arguments' se utilizó fue completamente diferente y, en última instancia, el objetivo de la pregunta. – steveo225

Respuesta

26

La forma principal de pasar un conjunto de argumentos generado por programa a una función es mediante el uso del método 'aplicar' de la función.

function show(foo, bar) { 
    window.alert(foo+' '+bar); 
} 
function run(f) { 
    // use splice to get all the arguments after 'f' 
    var args = Array.prototype.splice.call(arguments, 1); 
    f.apply(null, args); 
} 

run(show, 'foo', 'bar'); 
+0

Para Posteridad, si la función es un método de objeto y necesita mantener su contexto, pase el objeto 'this' en lugar de' null' con 'f.apply (this, args);'. – tmthydvnprt

1

es necesario utilizar la función de aplicar .. aquí es cómo se hace u :

function variableFunction1() 
    { 

    alert("variableFunction1 arguments length: " + arguments.length); 

    // calls second varargs function keeping current 'this'. 
    variableFunction2.apply(this, arguments); 
} 

function variableFunction2() 
{ 

    alert("variableFunction2 arguments length: " + arguments.length); 
} 

variableFunction1('a','b','c'); 

Demo

6

puede, de hecho, hacer esto con aplicar, si entiendo bien su pregunta:

function show(foo, bar) { window.alert(foo+' '+bar); } 
function run(f, args) { f.apply(null,args); } 
run(show, ['foo', 'bar']); 
+0

El problema con eso, ya tengo una configuración de framework usando 'arguments' y no quiero cambiar todas las llamadas para usar matrices. En eso mismo no, puedo intentar convertir 'arguments' de un objeto a una matriz y pasar eso. – steveo225

+0

Eche un vistazo a la solución de @Logan y parece que hará lo que necesita. – spike

0

En su ejemplo para pasar argumentos variables para mostrar esto funciona

function show(foo, bar) { window.alert(foo+' '+bar); } 
function run(f) { f.apply(null, Array().slice.call(arguments, 1)); } 
run(show, 'foo', 'bar'); 
Cuestiones relacionadas