2010-06-25 17 views
9

Creo que necesito algo como el símbolo de ruby ​​* aquí.Javascript: llamadas de función de reenvío que toman una cantidad variable de argumentos

function foo() { 
    var result = ''; 
    for (var i = 0; i < arguments.length; i++) { 
    result += arguments[i]; 
    } 
    return result; 
} 

function bar() { 
    return foo(arguments) // this line doesn't work as I expect 
} 

bar(1, 2, 3); 

Quiero este para volver "123", pero en su lugar me sale "[object Arguments]". Lo cual tiene sentido, supongo. Pasa el objeto que representa los argumentos, pero no los argumentos individualmente.

Entonces, ¿cómo puedo simplemente reenviar cualquier número de argumentos a otra función que tome cualquier cantidad de argumentos?

Respuesta

19

Para pasar correctamente los argumentos a otra función, es necesario utilizar apply:

function bar() { 
    return foo.apply(null, arguments); 
} 

El método apply toma dos parámetros, el primero es el thisObj, el valor de la misma se utilizará como el valor this dentro de la función invocada, si usa null o undefined, el valor this dentro de la función se referirá al objeto global.

El segundo argumento que apply espera es un objeto similar a una matriz que contiene los argumentos que se aplicarán a la función.

Consulte el ejemplo anterior here.

3

Pruebe esto return foo.apply(this,arguments). También puede usar Array.prototype.slice.apply(arguments).join('') para su función Foo.

Cuestiones relacionadas