2011-01-16 21 views
15

Mam funkcję, która akceptuje dowolną liczbę i rodzaj argumentów, więc nie określono żadnego konkretnego parametru. Ta funkcja powinna wywołać inną funkcję przekazującą wszystkie argumenty.Jak przekazać wszystkie argumenty jako kolekcję do innej funkcji, a nie jako pojedynczy argument?

Problem polega na tym, że mogę przekazywać "argumenty" w celu uwzględnienia wszystkich argumentów, ale w tym przypadku będzie to działać jak pojedynczy argument, a nie sposób, w jaki spodziewamy się, że argumenty będą działały.

Przykład:

Główną funkcją:

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

Stosując metodę powyżej, wszystkie argumenty będą przechowywane w „id_uzytkownika” pseudo-macierzy i elementy mogą być na przykład dostępne argumenty [2], ale nie używają nazwy parametru "param".

W ColdFusion rozwiązaniem dla takich rzeczy jest parametr "argumentCollection", w ten sposób można przekazać parametry przechowywane w strukturze bez konwersji do pojedynczego argumentu z typem struct zawierającym wszystkie klucze/wartości.

Jak mogę osiągnąć to samo z JavaScript?

Odpowiedz

29

Możesz użyć the .apply() method, aby wywołać funkcję i przekazać argumenty jako zestaw.

callSubFunction.apply(this, arguments); 

Pierwszy argument ustawić wartość this w sposobie allSubFunction. Po prostu ustawiłem ją na aktualną wartość this. Drugi to zbiór argumentów do wysłania.

Więc funkcja handleCall() będzie wyglądać następująco:

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

Nie jest wymagane, aby wysłać obiekt Arguments. Możesz wysłać Array argumentów, jeśli wymagają tego okoliczności.

1

Zastosowanie zastosować tak:

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

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

Jeśli chcesz zrobić to samo z spread syntax, można użyć następujących:

function handleCall(...args) { 
    callSubFunction(...args); 
} 
Powiązane problemy