2012-04-08 9 views
2

ich dieses Thema gefunden habe, die ich (siehe akzeptierte Antwort) implementiert haben:
javascript equivalent of PHP's call_user_func()Javascript-Äquivalent von PHP call_user_func

Allerdings habe ich mit mehreren Parametern ein Problem habe. Mir ist klar, dass ich meine Parameter in Strings verwandelte und sie wie einen Parameter behandelte, aber ich weiß nicht, wie ich das beheben kann, weil ich die Parameter dynamisch erstelle.

Bedeutung, ich habe folgendes in meinem Code definiert:

var a = new Array(); 
a[0] = new Array(); 
a[0][0] = 'alert'; 
a[0][1] = '\'Hello World\''; 
a[1] = new Array(); 
a[1][0] = 'setTimeout'; 
a[1][1] = 'alert("goodbye world")'; 
a[1][2] = '20'; 

Später wurde ich sie so nennen:

var j = 0; 
    var len = 0; 
    var fx = ''; 
    var params = ''; 
    for(i in a){ 
     params = ''; 
     len = a[i].length; 
     fx = a[i][0]; // getting the function name 
     a[i].splice(0, 1); // removing it from array 
     if(len > 1){ 
      params = a[i].join(", "); // trying to turn the parameters into the right format, but this is turning it into strings I think 
      params = params.replace(/\\'/g,'\''); // bc i was adding slashes with PHP 
     } 
     window[fx](params); 
    } 

Ich muss das nicht Arrays verwenden zu tun. Ich verstehe JS OOP nicht (habe es noch nicht ausprobiert), obwohl ich mich mit PHP OOP auskenne, also weiß ich nicht, ob es einen Weg gibt, dies zu tun.

Jede Hilfe bei der Übergabe mehrerer Parameter wäre willkommen.

Danke.

+1

'fenster [fx] .apply (obj, params)' – Cheeso

+2

Sie schießen sich in den Fuß hier. Für Anfänger: Sie sollten kein Array haben, das Code als * Strings * enthält, das ist einfach falsch. Und fangen Sie nicht damit an, diese Strings mit Regex zu interpretieren. Was versuchst du zu machen? Weiter: ** Benutze niemals eine 'for .. in'-Schleife für ein Array und du solltest' new Array() 'überhaupt nicht verwenden. – Tomalak

Antwort

11

Das erste, was zu tun ist: Schrott Ihren gesamten Code, von vorn beginnen. Ihre Herangehensweise wird Sie nirgendwo hinbringen, wo Sie sein möchten. (Leider kann ich Ihnen nicht sagen, wo Sie sein möchten, weil ich Ihr Beispiel nicht verstehen kann.)

Es gibt drei Möglichkeiten, eine Funktion in JavaScript aufzurufen.

function foo() { console.log(arguments); } 

// 1. directly 
foo(1, 2, 3); 

// 2. trough Function.call() 
foo.call(this, 1, 2, 3); 

// 3. trough Function.apply() 
var args = [1, 2, 3]; 
foo.apply(this, args); 

call und apply sind ähnlich. Sie lassen Sie entscheiden, welches Objekt das Schlüsselwort this in die Funktion zeigt (das ist das wichtige Bit!).

apply akzeptiert ein Array von Argumenten, call akzeptiert einzelne Argumente.

Am nächsten an call() ist PHP call_user_func(). Die nächste Sache zu apply() ist PHP call_user_func_array().

JavaScript-Objekte teilen etwas mit PHP-Arrays: Sie sind Schlüssel/Wert-Paare.

var obj = { 
    foo: function() { console.log(arguments); } 
}; 

Dies bedeutet, dass Sie Objekteigenschaften entweder mit der Punktnotation zugreifen:

obj.foo(1, 2, 3); 

oder durch eckige Klammer-Notation (beachten Sie, dass Objektschlüssel Strings):

var key = "foo"; 
obj[key](1, 2, 3); 
obj[key].call(obj, 1, 2, 3); 
obj[key].apply(obj, [1, 2, 3]); 

Eckige Klammer Die Notation gibt Ihnen die Freiheit, dynamisch eine Objekteigenschaft auszuwählen. Wenn diese Eigenschaft eine Funktion ist, gibt Ihnen apply() die Freiheit, Funktionsargumente dynamisch auszuwählen.

Jede Funktion oder Variable, die nicht als Eigenschaft eines bestimmten Objekts deklariert wurde, wird zur Eigenschaft des globalen Objekts.In Browsern ist das globale Objekt window. (So ​​die foo in meinem ersten Codeblock oben ist wirklich window.foo.)

Beachten Sie, dass this funktioniert nicht wie in PHP. Es wird auf das Objekt zeigen, dass die Funktion aufgerufen wurde, nicht das Objekt, zu dem die Funktion "gehört". (Der Begriff „gehört“ nicht wirklich existieren in JavaScript;. Dinge modelliert auf diese Weise sein kann, aber es ist nur eine Konvention)

Beim Direktruf (obj.foo(1, 2, 3)), wird this zu obj zeigen. Mit call und apply zeigt this auf welches Objekt Sie auch möchten. Das ist viel nützlicher als es zunächst klingt. Die meiste Zeit, wenn Sie Funktionen dynamisch aufrufen möchten, verwenden Sie am Ende apply.

1

Check out Function.apply:

function test(a, b) { console.log([a, b]) } 

test.apply(null, [1, 2]); // => [ 1, 2 ] 
Verwandte Themen