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!
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:
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:
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:
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].)
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:
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 .tooltip('show', var1, var2)
würde show(var1, var2)
aufrufen
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.
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.
Tags und Links javascript jquery