jQuery $ .map vs $ .fn.map verschiedene Argumente

8

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?

%Vor%

.each verhält sich nicht so

    
Mark Kahn 11.07.2011, 22:06
quelle

3 Antworten

3

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)

    
user113716 11.07.2011, 23:48
quelle
5

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).

Frédéric Hamidi 11.07.2011 23:00
quelle
0

Ok, ich habe etwas in den Code und das API Changelog gegraben.

$.fn.map ruft intern jQuery.map auf.

Es ist eine Schätzung (etwas berechnet), aber ich glaube, es wurde getan, um die Fähigkeit hinzuzufügen, Objekte / Sammlungen zu durchlaufen.

    
Mrchief 11.07.2011 22:36
quelle

Tags und Links