2012-02-18 16 views
26

:Javascript: İşlev için "Sonsuz" parametreler? Aşağıda birinde <code>console.log</code> yazdığınızda Chrome'da

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

... hiç hata veya uyarı içeren, doğru yazdırır. Daha fazla parametre ekledim, ancak yine de doğru şekilde basıyor.

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

Aynen böyle bir "sonsuz" parametre işlevine nasıl sahip olabilirim? onlar

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

alınan Ve Uygulamak yöntemi ile ters dönüşüm (bağımsız değişkenler listesi verilen bir fonksiyon diyoruz) yapabileceği tüm argümanları içeren arguments adlandırılan bir dizi benzeri nesneye erişebilen

cevap

46

Fonksiyonlar :

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

bazı önemli noktalar

not:

  1. arguments gerçek bir dizidir ve her zamanki dizi yöntemlerinden (dilim, birleştir, vb.) Hiçbirine sahip değildir. Aşağıdaki satır ile bir dizi dönüştürebilirsiniz:

    function foo(first_arg, second_arg /**/){ 
        var variadic_args = Array.prototype.slice.call(arguments, 2); 
    } 
    
  2. değil: Eğer dizi sadece alınan olmayan adlı argümanlar içermesini istiyorsanız

    var args = Array.prototype.slice.call(arguments); 
    
  3. Dilim de yararlıdır Her tarayıcı keyfi olarak çok sayıda işlev parametresini işleyebilir. Bunu son kez test ettim, Chrome ve IE'de 200.000 argümandan sonra bir yığın akış vardı. Eğer fonksiyonunuz keyfi olarak çok sayıda argüman alabilirse, bu argümanların tümünü yerine düzenli bir dizide paketlemeyi düşünün.

  4. Örneklerim için argüman listelerinde görünen yorumların zorunlu olmadığını yorumlayan /**/ yorumları. Onlar sadece benim variadic işlevlerimi işaretlemek ve bunları normal işlevlerden ayırt etmek için kullandığım bir kodlamadır.

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

Büyük cevap, uyarılar için +1, onları okumak ve ilkini koştu vermedi. –

0

Sen argümanlar dizisini kullanabilirsiniz: jsfiddle.net/kUnJ2/

+0

Bu, önceki yanıtın bir tekrarıdır. Gelecekte, alternatif bir cevap verebilir veya mevcut cevaplara değer ekleyebilirseniz yardımcı olur –