2012-02-18 32 views
26

W Chrome, kiedy wpisuję console.log w ten poniżej:JavaScript: parametry "nieskończone" dla funkcji?

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"); 

... drukuje poprawnie, bez błędów i ostrzeżeń. Dodałem więcej parametrów, ale nadal je poprawnie drukuje.

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"); 

Jak mogę mieć funkcję "nieskończonego" parametru podobną do tej?

Odpowiedz

46

Funkcje mogą uzyskać dostęp do obiektu tablicy podobny nazwie arguments który zawiera wszystkie argumenty, które są odbierane

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

i można zrobić odwrotny konwersji (wywołania funkcji podana lista argumentów) ze sposobu zastosowania :

// 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]); 

kilka ważnych punktów do uwaga:

  1. arguments nie jest faktyczną tablicą i nie ma żadnych zwykłych metod tablicowych (plaster, join, itp.). można przekonwertować go na tablicę z następującą linię:

    var args = Array.prototype.slice.call(arguments); 
    
  2. Kawałek jest również przydatna, jeśli chcesz, aby tablica tylko zawierają non-nazwane argumenty, które zostały odebrane:

    function foo(first_arg, second_arg /**/){ 
        var variadic_args = Array.prototype.slice.call(arguments, 2); 
    } 
    
  3. Nie każda przeglądarka może obsługiwać dowolnie dużą liczbę parametrów funkcji. Ostatni raz testowałem to, w Chrome i IE był stackoverflow po około 200 000 argumentów. Jeśli twoja funkcja może odbierać dowolnie dużą liczbę argumentów, zastanów się nad spakowaniem wszystkich tych argumentów w regularnej tablicy.

  4. Te komentarze /**/ pojawiające się na listach argumentów dla moich przykładów nie są obowiązkowe. To tylko kodowanie konwencji, której używam do oznaczania moich funkcji wariadycznych i odróżniania ich od zwykłych funkcji.

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

Wielką Odbierz, +1 za ostrzeżenia, że ​​nie je przeczytać i prowadził pierwszy. –

0

Można użyć tablicę argumenty jsfiddle.net/kUnJ2/

+0

To jest powtórzenie poprzedniej odpowiedzi. W przyszłości pomaga, jeśli możesz podać alternatywną odpowiedź lub dodać wartość do istniejących odpowiedzi –