Ich bin neu bei underscore.js. Was ist der Zweck von [context]
in _.each()
? Wie soll es verwendet werden?
162
Ich bin neu bei underscore.js. Was ist der Zweck von [context]
in _.each()
? Wie soll es verwendet werden?
Der Kontextparameter legt nur den Wert von this
in der Iteratorfunktion fest.
var someOtherArray = ["name","patrick","d","w"];
_.each([1, 2, 3], function(num) {
// In here, "this" refers to the same Array as "someOtherArray"
alert( this[num] ); // num is the value from the array being iterated
// so this[num] gets the item at the "num" index of
// someOtherArray.
}, someOtherArray);
Arbeitsbeispiel: http://jsfiddle.net/a6Rx4/
Es verwendet die Nummer von jedem Mitglied des Arrays, das iteriert wird, um das Element an dem Index von zu erhalten someOtherArray
, der durch dargestellt wird, this
seit wir es als Kontextparameter übergeben haben.
Wenn Sie den Kontext nicht festlegen, this
wird auf das window
Objekt verwiesen.
someOtherArray[num]
eher auf als beziehenthis[num]
?context
Hier wirdthis
in Ihrer Iteratorfunktion darauf verwiesen. Beispielsweise:quelle
In diesem Kontext können Sie beim Aufruf Argumente bereitstellen und so die generischen vorgefertigten Hilfsfunktionen einfach anpassen.
einige Beispiele:
Selbst anhand der begrenzten Beispiele können Sie sehen, wie leistungsfähig ein "zusätzliches Argument" für die Erstellung von wiederverwendbarem Code sein kann. Anstatt für jede Situation eine andere Rückruffunktion zu erstellen, können Sie normalerweise einen Helfer auf niedriger Ebene anpassen. Das Ziel ist, dass Ihre benutzerdefinierte Logik ein Verb und zwei Substantive mit minimalem Boilerplate bündelt.
Zwar haben Pfeilfunktionen viele der "Code Golf" -Vorteile generischer reiner Funktionen beseitigt, aber die semantischen und Konsistenzvorteile bleiben bestehen.
Ich füge immer
"use strict"
Helfer hinzu, um native[].map()
Kompatibilität beim Übergeben von Grundelementen zu gewährleisten . Andernfalls werden sie zu Objekten gezwungen, was normalerweise immer noch funktioniert, aber es ist schneller und sicherer, typspezifisch zu sein.quelle
Einfache Verwendung von _.each
Hier ist ein einfaches Beispiel , das Folgendes verwenden könnte
_.each
:Ausgabe:
Anstatt anzurufen
addItem
mehrmals anzurufen, können Sie den Unterstrich folgendermaßen verwenden :addItem
Dies ist identisch mit einem dreimaligen sequentiellen Aufruf mit diesen Elementen. Grundsätzlich iteriert es Ihr Array und ruft für jedes Element Ihre anonyme Rückruffunktion auf, die aufruftx.addItem(item)
. Die anonyme Rückruffunktion ähneltaddItem
Mitgliedsfunktion (z. B. nimmt sie ein Element) und ist irgendwie sinnlos. Anstatt eine anonyme Funktion zu durchlaufen, ist es besser,_.each
diese Indirektion zu vermeiden undaddItem
direkt aufzurufen :Dies
addItem
funktioniertthis
jedoch nicht , da sich die Mitgliederfunktion des Warenkorbs nicht auf Ihren vonx
Ihnen erstellten Warenkorb bezieht . Deshalb haben Sie die Möglichkeit, Ihren Warenkorb weiterzugebenx
wie[context]
:Vollständiges Beispiel, das _.each und context verwendet:
Kurz gesagt, wenn die Rückruffunktion, an die Sie
_.each
in irgendeiner Weise übergeben werden, verwendetthis
wird, müssen Sie angeben, woraufthis
in Ihrer Rückruffunktion Bezug genommen werden soll. Es mag wiex
überflüssig in meinem Beispiel ist, sondernx.addItem
ist nur eine Funktion und könnte völlig unabhängig vonx
oderbasket
oder einem anderen Objekt, zum Beispiel :Mit anderen Worten, Sie binden einen Wert an
this
Ihren Rückruf, oder Sie können bind auch direkt wie folgt verwenden:Wenn eine
underscorejs
Methode eine Rückruffunktion verwendet und dieser Rückruf für eine Elementfunktion eines Objekts (z. B. eine verwendete Funktionthis
) aufgerufen werden soll, können Sie diese Funktion im Allgemeinen an ein Objekt binden oder dieses Objekt als[context]
Parameter übergeben, und das ist die primäre Absicht. Und ganz oben in der Dokumentation zu Unterstrichen steht genau das: Der Iterat ist an das Kontextobjekt gebunden, wenn eines übergeben wirdquelle
Wie in anderen Antworten erläutert,
context
wird derthis
Kontext, der innerhalb des Rückrufs verwendet werden soll, an übergebeneach
.Ich werde dies mit Hilfe des Quellcodes der relevanten Methoden aus erklären Unterstrich
Die Definition von
_.each
oder_.forEach
lautet wie folgt:Die zweite Aussage ist hier wichtig zu beachten
Hier
context
wird an eine andere Methode übergebenoptimizeCb
und die von ihr zurückgegebene Funktion wird dann zugewiesen,iteratee
die später aufgerufen wird.Wie aus der obigen Methodendefinition von ersichtlich ist
optimizeCb
,context
wird , wenn nicht bestanden,func
zurückgegeben, wie es ist. Wenncontext
übergeben, wird die Rückruffunktion als aufgerufenfunc
wird aufgerufen, mitcall()
dem eine Methode aufgerufen wird, indem derthis
Kontext festgelegt wird. Wennthis
es also im Inneren verwendet wirdfunc
, bezieht es sich aufcontext
.Sie können
context
als letzten optionalen ParameterforEach
in JavaScript betrachten.quelle