2011-01-16 18 views
15

Tengo una función que acepta cualquier número y tipo de argumentos, por lo que no se ha definido ningún parámetro específico. Esta función debería llamar a otra función pasando todos los argumentos.¿Cómo pasar todos los argumentos como colección a otra función y no como un solo argumento?

El problema es que puedo pasar "argumentos" para incluir todos los argumentos, pero en este caso funcionará como un único argumento y no de la manera en que esperamos que funcionen los argumentos.

Un ejemplo:

La función principal:

function handleCall() { 
    // let's call a sub-function 
    // and pass all arguments (my question is how this is handled the right way) 
    function callSubFunction(arguments); 
} 

function callSubfunction(userid, customerid, param) { 
    // passed arguments are now 
    alert('userid = ' + userid); 

    // this will not work, you have to use arguments[2] 
    alert(param); 
    } 

The example call: 

handleCall(1029, 232, 'param01'); 

Usando el enfoque anterior, se almacenará todos los argumentos en "identificador de usuario" como pseudo-array y los artículos se puede acceder, por ejemplo, argumentos [2] pero no usa el nombre del parámetro "param".

En ColdFusion, la solución para tales cosas es el parámetro "argumentCollection", de esta manera puede pasar parámetros almacenados en una estructura sin convertirlos en un solo argumento con la estructura tipo que contiene todas las claves/valores.

¿Cómo puedo lograr lo mismo con JavaScript?

Respuesta

29

Puede usar the .apply() method para llamar a una función y pasar los argumentos como un conjunto.

callSubFunction.apply(this, arguments); 

El primer argumento establecerá el valor de this en el método allSubFunction. Lo configuré con el valor actual de this. El segundo es la colección de argumentos para enviar.

Por lo que su función se verá como handleCall():

function handleCall() { 
    //set the value of "this" and pass on the arguments object 
    callSubFunction.apply(this, arguments); 
} 

No es necesario que envíe un objeto Arguments. Puede enviar un Array de argumentos si las circunstancias lo requieren.

1

Uso aplicar de este modo:

function Foo() 
{ 
    Bar.apply(this, arguments); 
} 

function Bar(a, b) 
{ 
    alert(a); 
    alert(b); 
} 
15

Si usted quiere hacer lo mismo con el spread syntax, puede utilizar el siguiente:

function handleCall(...args) { 
    callSubFunction(...args); 
} 
Cuestiones relacionadas