2010-12-30 11 views
3

Ich mag würde eine JavaScript-Funktion schreiben, die so etwas wie das funktioniert ...Passing beliebige Anzahl von Parametern eine Funktion in Javascript

f([["a"]], function(e){alert(e);}); 
// results in alert("a"); 

f([["a"], ["b"]], function(e1,e2){alert(e1 + ":" + e2);}); 
//results in alert("a:b"); 

f([["a", "b"], ["c"]], function(e1,e2){alert(e1 + ":" + e2);}); 
//results in alert("a:c");alert("b:c"); 

ich eine rekursiven Lösung für das Looping denken kann, aber wie Ich sende eine "unbekannte" Anzahl von Variablen an eine Funktion?

Antwort

3

Wenn Sie alle Ihre Argumente in ein Array setzen (lässt es foo nennen), können Sie die apply durch die Verwendung einer Funktion fn mit diesen Argumenten aufrufen kann - Funktion.

fn.apply(null, foo) 

Das erste Argument (null in diesem Fall) ist, was Sie this innerhalb der aufgerufenen Funktion sein soll. null wird wahrscheinlich für Sie arbeiten.

+0

Sieht aus wie ich brauche. Danke =) – mncl

0

Innerhalb der Funktion können Sie die Variable arguments verwenden, um zu sehen, was übergeben wurde.

IE
function blah() { 
    console.log(arguments); 
} 

blah(1, 2); // [1, 2] 
blah([1, 2], [3]); // [[1,2], [3]] 
blah(1, [2, 3], "string"); // [1, [2, 3], "string"] 
+0

Die Frage ist das genaue Gegenteil, ich denke .. wenn nicht können Sie schreiben, wie F aussehen würde? – mncl

+0

Sie haben gefragt, wie Sie unbekannte Variablen erhalten. Die Antwort ist die Argumentvariable. Ich bin mir nicht sicher, was Sie sonst noch fragen. – Robert

+0

Ich frage, wie unbekannte Variablen POST - f() will eine Funktion mit der Array-Größe Anzahl der Argumente aufrufen. Nicht gelesene Anzahl von Argumenten. – mncl

0

Sie können den verfügbaren arguments pseudo-Array zum Einsatz innerhalb der Funktion, die Argumente übergeben zu bekommen, ohne sie ausdrücklich zu erklären (i, e. Unabhängig davon, ob Sie ein Argument für eine Funktion definieren, können Sie alles zugreifen über die arguments implizite Variable innerhalb dieser Funktion an die Funktion übergeben).

0

Sie können die arguments Variable verwenden, die jede Funktion durch alle übergebenen Argumente durchlaufen muss.

function myConcat(separator) { 
    var result = ""; // initialize list 
    // iterate through arguments 
    for (var i = 1; i < arguments.length; i++) { 
     result += arguments[i] + separator; 
    } 
    return result; 
} 

Siehe this Artikel für eine Diskussion über variable Anzahl von Argumenten.

+0

Hm, wir haben beide den gleichen Artikel gefunden! Muss eine gute Ressource sein. – NickAldwin

2

Nach this page können Sie alle Zugriff/alle Argumente der arguments Variable:

function f() { 
    for(var i = 0; i < arguments.length; i++) { 
     //do something with arguments[i] 
    } 
} 

[EDIT]

Nun, da ich verstehe, was Sie versuchen, zu tun, ist hier eine (dirty) Weg es zu tun:

Im Ernst, tun Sie es nicht so. Es ist schrecklich. Welpen werden sterben.

function f(arr, fn) { 
    var s = "fn("; 
    for(var i = 0; i < arr.length; i++) { 
     //you can implement your recursive code here if you like; I'm just doing the base cases 
     s += arr[i]; 
     if(i+1 < arr.length) { 
      s += ","; 
     } 
    } 
    s += ");"; 
    eval(s); 
} 

Und für eine saubere Art und Weise:

function f(arr, fn) { 
    fn.apply(this, arr); 
} 
+0

f() hat feste Argumente. ein Array von Arrays und eine Funktion - ich muss eine unbekannte Anzahl von Argumenten an die anonyme Alert-Funktion senden – mncl

+0

@mncl Ah, habe ich falsch verstanden. Also nimmt die anon Funktion immer die gleiche Anzahl von Argumenten wie die Länge des Arrays? – NickAldwin

+0

Ja.Die Warnungsfunktion führt diese Argumente bei Bedarf durch. Aber wie gebe ich die Variablen weiter? Das ist die Frage. – mncl

Verwandte Themen