Je suis nouveau sur underscore.js. Quel est le but de [context]
in _.each()
? Comment doit-il être utilisé?
162
Je suis nouveau sur underscore.js. Quel est le but de [context]
in _.each()
? Comment doit-il être utilisé?
Le paramètre context définit simplement la valeur de this
dans la fonction d'itérateur.
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);
Exemple de travail: http://jsfiddle.net/a6Rx4/
Il utilise le numéro de chaque membre du tableau en cours d'itération pour obtenir l'élément à cet index de someOtherArray
, qui est représenté par this
puisque nous l'avons passé en tant que paramètre de contexte.
Si vous ne définissez pas le contexte, alors this
fera référence à l' window
objet.
someOtherArray[num]
plutôt quethis[num]
?context
est oùthis
fait référence dans votre fonction d'itérateur. Par exemple:la source
Le contexte vous permet de fournir des arguments au moment de l'appel, permettant une personnalisation facile des fonctions d'assistance génériques pré-construites.
quelques exemples:
Même à partir des exemples limités, vous pouvez voir à quel point un "argument supplémentaire" peut être puissant pour créer du code réutilisable. Au lieu de créer une fonction de rappel différente pour chaque situation, vous pouvez généralement adapter un assistant de bas niveau. L'objectif est d'avoir votre logique personnalisée regroupant un verbe et deux noms, avec un minimum de passe-partout.
Certes, les fonctions fléchées ont éliminé de nombreux avantages de «code golf» des fonctions pures génériques, mais les avantages sémantiques et de cohérence demeurent.
J'ajoute toujours
"use strict"
aux helpers pour fournir une[].map()
compatibilité native lors du passage des primitives. Sinon, ils sont forcés en objets, ce qui fonctionne généralement toujours, mais il est plus rapide et plus sûr d'être spécifique au type.la source
Utilisation simple de _.each
Voici un exemple simple qui pourrait utiliser
_.each
:Production:
Au lieu d'appeler
addItem
plusieurs fois, vous pouvez utiliser le soulignement de cette façon:ce qui revient à appeler
addItem
trois fois de manière séquentielle avec ces éléments. Fondamentalement, il itère votre tableau et pour chaque élément appelle votre fonction de rappel anonyme qui appellex.addItem(item)
. La fonction de rappel anonyme est similaire à laaddItem
fonction membre (par exemple, elle prend un élément) et est un peu inutile. Donc, au lieu de passer par une fonction anonyme, il vaut mieux_.each
éviter cette indirection et appeleraddItem
directement:mais cela ne fonctionnera pas, car la
addItem
fonction membre de l' intérieur du panierthis
ne fera pas référence à votrex
panier que vous avez créé. C'est pourquoi vous avez la possibilité de passer votre panierx
pour être utilisé comme[context]
:Exemple complet utilisant _.each et le contexte:
En bref, si la fonction de rappel à laquelle vous passez d'
_.each
une manière ou d'une autre utilise,this
vous devez spécifier ce à quoi vous devezthis
faire référence dans votre fonction de rappel. Cela peut semblerx
redondant dans mon exemple, mais cex.addItem
n'est qu'une fonction et pourrait être totalement indépendante dex
oubasket
ou de tout autre objet, par exemple :En d'autres termes, vous liez une valeur à l'
this
intérieur de votre rappel, ou vous pouvez également utiliser bind directement comme ceci:En général, si une
underscorejs
méthode prend une fonction de rappel et si vous voulez que ce rappel soit appelé sur une fonction membre d'un objet (par exemple, une fonction qui utilisethis
), vous pouvez lier cette fonction à un objet ou passer cet objet comme[context]
paramètre et c'est l'intention première. Et en haut de la documentation de underscorejs, c'est exactement ce qu'ils déclarent: l'iteratee est lié à l'objet de contexte, s'il est passéla source
Comme expliqué dans d'autres réponses,
context
lethis
contexte à utiliser dans le rappel est-il passéeach
.Je vais vous expliquer cela à l'aide du code source des méthodes pertinentes à partir du code source de soulignement
La définition de
_.each
ou_.forEach
est la suivante:La deuxième déclaration est importante à noter ici
Ici,
context
est passé à une autre méthodeoptimizeCb
et la fonction renvoyée par celle-ci est ensuite affectée àiteratee
laquelle est appelée ultérieurement.Comme on peut le voir à partir de la définition de méthode ci-dessus
optimizeCb
, sicontext
n'est pas passé, ilfunc
est renvoyé tel quel. Sicontext
est passé, la fonction de rappel est appelée commefunc
est appelé aveccall()
lequel est utilisé pour invoquer une méthode en définissant sonthis
contexte. Donc, quand ilthis
est utilisé à l'intérieurfunc
, il fera référence àcontext
.Vous pouvez considérer
context
comme le dernier paramètre facultatifforEach
dans JavaScript.la source