Was macht dieser Code?

8

Ich lese jQuerys "Plugins / Authoring" , obwohl ich bereits ein paar jQuery-Plugins geschrieben habe. Jetzt sehe ich, dass jQuery eine besondere Methode hat, die Methoden zu definieren und aufzurufen:

%Vor%

Ich verstehe das Konzept dessen, was am Ende passieren wird ... aber wie genau? Dieser Teil verwirrt mich:

%Vor%

Warum Array.prototype.slide.call(argumetns, 1) ? Und woher kommen die variablen "Argumente" plötzlich? Jede kurze oder tiefere Erklärung wird sehr geschätzt. Es wird gesagt, dass Plugins so geschrieben werden sollten ... also würde ich gerne wissen warum.

Danke!

    
Nils Riedemann 08.11.2010, 11:21
quelle

5 Antworten

15

arguments

arguments ist ein Teil der JavaScript-Sprache. Ich war in genau wie du warst, als ich das erste Mal darauf stieß; es ist nicht nur du. :-) Es ist eine automatische lokale Variable in jeder Funktion und ist eine Array-ähnliche Struktur, die Ihnen alle Argumente gibt (siehe Abschnitt 10.6 von die Spezifikation ), zB:

%Vor%

Wenn ich sage, dass arguments Array-ähnlich ist, dann meine ich das - es ist nicht ein Array. Seine Referenzen auf die Argumente sind live (und bidirektional). Zum Beispiel:

%Vor%

Beachten Sie, dass bei der Zuweisung eines Werts an namedArg das Ergebnis in arguments[0] widergespiegelt wird und umgekehrt.

arguments ist wirklich cool, aber benutze es nur, wenn du es brauchst - einige Implementierungen beschleunigen das Aufrufen von Funktionen, indem sie es nicht verbinden, bis die Funktion tatsächlich versucht, auf sie zuzugreifen, was die Funktion verlangsamen kann (sehr leicht).

arguments hat auch eine Eigenschaft namens callee , die eine Referenz auf die Funktion selbst ist:

%Vor%

Es ist jedoch am besten, arguments.callee aus verschiedenen Gründen zu vermeiden. Ein Grund ist, dass es in vielen Implementierungen wirklich langsam ist (ich weiß nicht warum, aber um Ihnen eine Idee zu geben, kann der Funktionsaufruf-Overhead um eine Größenordnung erhöhen wenn Sie arguments.callee verwenden). Ein weiterer Grund ist, dass Sie es nicht im neuen "strikten" Modus von ECMAScript5 verwenden können.

(Einige Implementierungen hatten auch arguments.caller - Schauder - aber zum Glück war es nie weit verbreitet und ist nirgendwo standardisiert [und wahrscheinlich auch nicht].)

Der slice -Aufruf und apply

Betreffend

%Vor%

In diesem Fall werden mit der Methode Array#slice die Argumente in ein Array kopiert (abzüglich des ersten Arguments, das aufgerufen wurde) und dann das resultierende Array in die Funktion Function#apply der Funktionsinstanz übergeben es ruft an. Function#apply ruft die Funktionsinstanz mit dem angegebenen this -Objekt und den als Array angegebenen Argumenten auf. Der Code verwendet nicht nur arguments.slice , weil (wieder) arguments nicht wirklich ein Array ist und man sich daher nicht darauf verlassen kann, dass es alle Array-Funktionen hat, aber die Spezifikation sagt (in Abschnitt 15.4.4.10) genau das Sie können die Funktion Array.prototype.slice auf alles anwenden, was Array-ähnlich ist, und das tun sie auch.

Function#apply und Function#call sind ebenfalls integrierte Teile von JavaScript (siehe Abschnitte 15.3.4.3 und 15.3.4.4). Hier sind einfachere Beispiele für jedes:

%Vor%     
T.J. Crowder 08.11.2010, 11:26
quelle
3

arguments ist ein Schlüsselwort, die an die Funktion übergebenen Argumente. Aber Sie wollen nicht alle von ihnen, seit dem ersten wissen Sie, es ist method , also nimmt dies jedes Argument über das erste, um in .apply() ... übergibt diese Argumente an die Methode, die im ersten Argument method angegeben wurde.

Wenn method nicht gefunden werden kann (dh, das erste Argument war nicht 'init' , 'show' , 'hide' oder 'update' , dann wird es in den else -Teil übernommen und übergibt alle die Argumente für die Methode init (die Standardeinstellung, wenn Sie so wollen).

Zum Beispiel:

  • .tooltip({ thing: value }) würde init({ thing: value }) aufrufen, da dies der Standard
  • ist
  • .tooltip('show', var1, var2) würde show(var1, var2) aufrufen
Nick Craver 08.11.2010 11:26
quelle
1

Die Variable arguments ist eine definierte JavaScript-Variable. Es speichert alle Argumente, die in array in Funktion aufgerufen werden. Zum Beispiel:

%Vor%     
antyrat 08.11.2010 11:27
quelle
1

Array.prototype.slide.call(argumetns, 1) konvertiert das arguments Pseudo-Array in ein reales Array (überspringt das erste Element).

arguments enthält alle Argumente, mit denen die Funktion, in der Sie sich gerade befinden, aufgerufen wurde. Es wird automatisch von JavaScript bereitgestellt. Da wir ein reelles Array benötigen ( arguments kann nicht manipuliert werden usw.), wandeln wir es mit dieser Anweisung in eins um.

    
jwueller 08.11.2010 11:27
quelle
1

arguments ist eine spezielle JavaScript-Variable, die "alle Argumente für diese Funktion" bedeutet. Es ist kein Array, sondern verhält sich fast wie eins, also ruft arguments.slice(1) anstatt Array.prototype.slice.call(arguments, 1) auf und ruft func(1, 2, 3, 4) ; was es tut, nimmt alles außer dem ersten Wert in der Liste - für [2, 3, 4] wird es $.fn.tooltip('foo', 'bar', 'baz') sein.

Das Endergebnis davon ist, dass wenn Sie methods['foo']('bar', 'baz') aufrufen, versucht wird, %code% aufzurufen.

    
Chris Morgan 08.11.2010 11:27
quelle

Tags und Links