2012-02-18 21 views
26

En Chrome, cuando escribo console.log en la de abajo:Javascript: parámetros "infinitos" para la función?

console.log("A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter"); 

... se imprime correctamente, sin errores o advertencias. Agregué más parámetros, pero todavía se imprime correctamente.

console.log("A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter"); 

¿Cómo puedo tener una función de parámetro "infinito" como esa?

Respuesta

46

funciones pueden tener acceso a un objeto de matriz, llamado arguments que contiene todos los argumentos que han recibido

function print_my_arguments(/**/){ 
    var args = arguments; 
    for(var i=0; i<args.length; i++){ 
     console.log(args[i]); 
    } 
}; 

y se puede hacer la conversión opuesta (llamar a una función dada una lista de argumentos) con el método de aplicación :

// These are equivalent: 
print_my_arguments(1,2,3); 
print_my_arguments.apply(null, [1,2,3]); 

// The first parameter to `apply` is the `this`. 
// It is used when the function is a method. 
foo.bar(1,2,3); 
var f = foo.bar; f.apply(foo, [1,2,3]); 

Algunos puntos importantes a destacar:

  1. arguments no es una matriz real y no tiene ninguno de los métodos de matriz habituales (cortar, unir, etc.). Puede convertirlo en una matriz con la siguiente línea:

    var args = Array.prototype.slice.call(arguments); 
    
  2. Slice también es útil si desea que su matriz para contener únicamente los argumentos sin nombre que se recibieron:

    function foo(first_arg, second_arg /**/){ 
        var variadic_args = Array.prototype.slice.call(arguments, 2); 
    } 
    
  3. No

    cada navegador puede manejar una cantidad arbitrariamente grande de parámetros de funciones. La última vez que probé esto, en Chrome e IE hubo un stackoverflow después de unos 200,000 argumentos. Si su función puede recibir una cantidad arbitrariamente grande de argumentos, considere empacar todos esos argumentos en una matriz regular en su lugar.

  4. Esos /**/ comentarios que aparecen en las listas de argumentos para mis ejemplos no son obligatorios. Son solo una codificación de una convención que utilizo para marcar mis funciones variadas y diferenciarlas de las funciones normales.

    // A quick glance would suggest that this function receives no 
    // parameters but actually it is a variadic function that gets 
    // its parameters via the `arguments` object. 
    function foo(){ 
        console.log(arguments.length); 
    } 
    
+0

Gran respuesta, 1 de las advertencias, no he leído ellos y encontré la primera. –

0

Puede utilizar la matriz de argumentos: jsfiddle.net/kUnJ2/

+0

Esto es una repetición de la respuesta anterior. En el futuro, ayuda si puede proporcionar una respuesta alternativa o agregar valor a la (s) respuesta (s) existente (s) –

Cuestiones relacionadas