2011-06-22 25 views
6

w moim projekcie rejestruję różne funkcje (o różnej liczbie argumentów) jako słuchaczy szeregu zdarzeń. Kiedy zdarzenie ma miejsce, muszę odpalić powiązaną funkcję. Otrzymuję parametry, które należy przekazać do metody detektora w postaci tablicy, podczas gdy funkcja detektora oczekuje każdego oddzielnego argumentu. Tak, robię to w ten sposób, ale nie podoba mi się podejście i chciałbym wiedzieć, czy istnieje elegancki sposób to zrobić,JavaScript nieznana liczba argumentów

function callListenerWithArgs(func, args){ 
     switch(args.length){ 
      case 1: 
       func(args[0]); 
       break; 
      case 2: 
       func(args[0], args[1]); 
       break; 
      case 3: 
       func(args[0], args[1], args[2]); 
       break; 
      case 4: 
       func(args[0], args[1], args[2], args[3]); 
       break; 
      default: 
       func(); 
     } 
    } 
+0

Dziękuję wszystkim. fun.apply robi dokładnie to, czego potrzebowałem. Jest prosty i słodki :) i precyzyjnie rozwiązuje mój problem. – Nutty

Odpowiedz

2

Użyj. zastosowanie

func.apply(null, args) 

Jeśli trzeba powiązać z określonym zakresem, można przekazać innym argumentem użyć jako this wewnątrz funkcji:

func.apply(scope, args); 

Ponadto niuans JavaScriptu umożliwia wywoływanie funkcji o niezdefiniowanych wartościach. Tak więc dokonując niewielkiej uszczypnąć do istniejącego kodu będzie działać w 95% wszystkich przypadków (to nie jest sugerowane jako rozwiązanie, po prostu kierując go na zewnątrz):

// will handle any number of args up to 7 
function callListenerWithArgs(func, args){ 
    func(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); 
} 

Jeśli func jest zdefiniowany jako:

function foo(a, b, c){ 
} 

Otrzymujesz a, b, c, wraz z niektórymi więcej wartościami undefined, które zostaną zignorowane. Jak już wspomniałem powyżej, działa to w 95% przypadków. To nie działa, jeśli kiedykolwiek sprawdzasz arguments.length w wywołanej funkcji, ponieważ zawsze będzie taka sama, bez względu na liczbę parametrów zdefiniowanych przez funkcję.

1

Spróbuj używając function.apply

function callListenerWithArgs(func, args){ 
    func.apply(window, args); 
} 
+0

.call nie pobiera tablic. .apply robi –

+0

@cwolves. spójrz na moją odpowiedź ponownie. – Neal

+2

edytowałeś to, mój komentarz nadal był stosowany –

1

functionName.apply(thisScope, arguments) byłby bardziej elegancki. Argument arguments musi być tablicą.

Można zbudować Array jak:

var args = []; 

switch (arguments.length - 1) { 
    case 0: 
     break; 
    case 1: 
     args.push(arguments[1]); 
     break; 
    case 2: 
     args.push(arguments[1], arguments[2]); 
     break; 
    case 3: 
     args.push(arguments[1], arguments[2], arguments[3]); 
     break; 
    default: 
     args = Array.prototype.slice.call(arguments, 1); 
} 

lub jeśli tablica jest już zbudowany, po prostu przekazać go jako drugi argument do .apply

+0

@Dvvoter: Wytłumacz. – Robert

-1

można uzyskać liczbę argumentów funkcji:

var f = function () { console.log(arguments.length); } 
f(2, 3) // > 2 

który pozwala realizować swoją funkcję func bezpośrednio na miejscu.

function func() { 
    var nbArgs = arguments.length; 
    // ... 
} 
Powiązane problemy