Ich frage mich nur, ob jemand weiß, warum $.map
und $.fn.map
Argumente in umgedrehter Reihenfolge von einander übergeben. Gibt es dafür einen gültigen Grund (z. B. ECMA-Spezifikationen) oder war es nur eine schlecht geplante API, die aufgrund der Menge an Code, die auf jQuery angewiesen ist, nicht mehr repariert werden kann?
.each
verhält sich nicht so
Hier ist meine ganz und gar spekulative "Antwort".
jQuery.each()
, .each()
und jQuery.map()
waren alle in Version 1 vorhanden.
.map()
wurde in 1.2 hinzugefügt.
Meine Vermutung ist, dass sie einfach nicht darauf geachtet haben, dass die each
Methoden der forEach
in der Spezifikation folgen. (Wie war der Status von ES 5 zu dieser Zeit überhaupt?) Aber aus irgendeinem Grund sind sie der Spezifikation für $.map()
näher gekommen. (Vielleicht war seine ursprüngliche Absicht auch hauptsächlich für den internen Gebrauch.)
Also, als jQuery 1.2 kam, entschieden sie sich für eine .map()
-Methode.
Die Frage war also, dass .map()
folge $.each()
und .each()
oder $.map()
folgen.
Da .each()
insbesondere bereits als abrufbar gegen ein jQuery-Objekt implementiert wurde, hatten sie das Gefühl, dass es weniger Verwirrung geben würde, wenn .map()
folge .each()
folgen würde als $.map()
, was höchstwahrscheinlich nicht verwendet wird so viel.
Die Quelle für die Methode .map()
vs die Methode .each()
, Sie können das sehen .map()
benötigt eine Zwischenfunktion, um die Argumente umzudrehen und den this
-Wert festzulegen. Irgendwie bezweifle ich, dass sie das gewollt hätten, wenn sie alles im Voraus geplant hätten.
Auch dies ist vollständig und spekulieren , aber ich wäre nicht überrascht, wenn es so etwas passieren würde.
Nimm es oder lass es. ; o)
Tatsächlich könnte dies als ein Versehen betrachtet werden, aber es gibt einen sehr guten Grund dafür, dass die Argumente in dieser Reihenfolge verabschiedet werden.
Das liegt natürlich an der Oberfläche, weil map () / each () Methoden und $ .map () sollen nicht gleichwertig sein, und jede Seite soll auf ihre eigene Weise verwendet werden (Umgang mit jQuery-Objekten und Arrays) / Hashes).
Aber der Hauptpunkt ist, dass die Parameterposition für den Fall optimiert ist, dass Ihre Callback-Funktion nur ein einzelnes Argument verwenden möchte . Betrachte beide Fälle:
map()
und each()
sollen auf jQuery-Objekten aufgerufen werden, und die Callback-Funktion wird im Kontext jedes DOM-Elements aufgerufen, das an der Zuordnung / Schleife beteiligt ist (das Kontextobjekt steht über die this
Schlüsselwort). Daher ist es sinnvoller, zuerst den Index und dann das Element zu übergeben, weil this
bereits das Element bezeichnet.
$.map()
behandelt Arrays und Javascript-Objekte (Hashes), und die Callback-Funktion wird im "globalen" Kontext aufgerufen ( this
ist immer das window
-Objekt). Daher ist es sinnvoller, zuerst den Wert und dann den Index zu übergeben, da das Mapping ungefähr ist und Schleifenindexvariablen an erster Stelle vermeidet . Wenn der Aufrufer an diesen interessiert ist, kann er eine "standard" for
-Schleife verwenden (oder das zweite Argument, das an die Callback-Funktion übergeben wird).
Tags und Links jquery