2011-01-16 27 views
15

Herhangi bir sayı ve tür argümanı kabul eden bir işlev var, bu nedenle belirli bir parametre tanımlanmadı. Bu işlev tüm argümanları ileten başka bir işlevi çağırmalıdır. Sorun, tüm argümanları içermek için "argümanları" geçebileceğim, fakat bu durumda, argümanların çalışmasını beklememizin yolunu değil, tek bir argüman gibi çalışacak olmasıdır.Tüm bağımsız değişkenler koleksiyon olarak tek bir argüman olarak değil, başka bir işleve nasıl aktarılır?

Bir örnek:

ana işlevi

:

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

yukarıdaki yaklaşım kullanılarak, tüm bağımsız değişkenler sözde dizi olarak "kullanıcı adını" olarak kaydedilir ve ürün, örneğin erişilebilir argümanlar [2] fakat parametre adı "param" kullanılmıyor.

ColdFusion'da, bu tür şeyler için çözüm "argumentCollection" parametresidir, böylece bir yapı içinde saklanan parametreleri, tüm anahtar/değerleri içeren tür yapısıyla tek bir bağımsız değişkene dönüştürülmeden geçirebilirsiniz.

JavaScript ile aynı şeyi nasıl yapabilirim?

cevap

29

Bir işlevi çağırmak ve bağımsız değişkenleri bir dizi olarak iletmek için the .apply() method'u kullanabilirsiniz.

callSubFunction.apply(this, arguments); 

ilk bağımsız allSubFunction yöntemde this değerini belirleyecektir. Sadece mevcut this değerine ayarlıyorum. İkincisi, gönderilecek argümanların toplanmasıdır.

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

Size bir Arguments nesneyi göndermesi gerekmez:

Yani handleCall() fonksiyonu gibi görünecektir. Gerekirse, Array argümanlarını gönderebilirsiniz.

1

Kullanım şöyle uygulanır:

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

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

Eğer spread syntax ile aynı yapmak istiyorsanız, aşağıdaki kullanabilirsiniz:

function handleCall(...args) { 
    callSubFunction(...args); 
} 
İlgili konular