Soy nuevo en underscore.js. ¿Cuál es el propósito de [context]
en _.each()
? ¿Cómo debe usarse?
162
Soy nuevo en underscore.js. ¿Cuál es el propósito de [context]
en _.each()
? ¿Cómo debe usarse?
El parámetro de contexto solo establece el valor de this
en la función de iterador.
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);
Ejemplo de trabajo: http://jsfiddle.net/a6Rx4/
Utiliza el número de cada miembro de la matriz que se itera para obtener el elemento en ese índice de someOtherArray
, que se representa this
desde que lo pasamos como parámetro de contexto.
Si no establece el contexto, this
se referirá al window
objeto.
someOtherArray[num]
más quethis[num]
?context
es donde sethis
refiere en su función de iterador. Por ejemplo:fuente
El contexto le permite proporcionar argumentos en el momento de la llamada, lo que permite una fácil personalización de las funciones auxiliares genéricas preconstruidas.
algunos ejemplos:
Incluso a partir de los ejemplos limitados, puede ver cuán poderoso puede ser un "argumento adicional" para crear código reutilizable. En lugar de hacer una función de devolución de llamada diferente para cada situación, generalmente puede adaptar un asistente de bajo nivel. El objetivo es tener su lógica personalizada agrupando un verbo y dos sustantivos, con un mínimo repetitivo.
Es cierto que las funciones de flecha han eliminado muchas de las ventajas de "golf de código" de las funciones genéricas puras, pero las ventajas de semántica y consistencia permanecen.
Siempre agrego
"use strict"
a los ayudantes para proporcionar[].map()
compatibilidad nativa al pasar primitivas. De lo contrario, se convierten en objetos, que por lo general todavía funcionan, pero es más rápido y seguro ser específico para cada tipo.fuente
Uso simple de _.each
Aquí hay un ejemplo simple que podría usar
_.each
:Salida:
En lugar de llamar
addItem
varias veces , puede usar subrayado de esta manera:que es idéntico a llamar
addItem
tres veces secuencialmente con estos elementos. Básicamente, itera su matriz y para cada elemento llama a su función de devolución de llamada anónima que llamax.addItem(item)
. La función de devolución de llamada anónima es similar a laaddItem
función miembro (por ejemplo, toma un elemento) y no tiene sentido. Entonces, en lugar de pasar por una función anónima, es mejor que_.each
evite esta indirección y llameaddItem
directamente:pero esto no funcionará, ya que la
addItem
función miembro dentro de la cestathis
no se referirá a lax
cesta que creó. Es por eso que tiene la opción de pasar su canastax
para usarla como[context]
:Ejemplo completo que usa _.each y context:
En resumen, si la función de devolución de llamada a la que pasa de
_.each
alguna manera usa,this
entonces debe especificar a quéthis
debería referirse dentro de su función de devolución de llamada. Puede parecer quex
es redundante en mi ejemplo, perox.addItem
es sólo una función y podría ser totalmente ajenos ax
obasket
o cualquier otro objeto, por ejemplo :En otras palabras, enlaza algún valor
this
dentro de su devolución de llamada, o bien puede usar el enlace directamente de esta manera:En general, si algún
underscorejs
método toma una función de devolución de llamada y si desea que esa devolución de llamada se invoque en alguna función miembro de algún objeto (por ejemplo, una función que usathis
), puede vincular esa función a algún objeto o pasar ese objeto como[context]
parámetro y eso es La intención principal. Y en la parte superior de la documentación de subrayado, eso es exactamente lo que dicen: el iterado está vinculado al objeto de contexto, si se pasa unofuente
Como se explica en otras respuestas,
context
es elthis
contexto que se utilizará dentro de la devolución de llamada que se pasaeach
.Explicaré esto con la ayuda del código fuente de métodos relevantes del código fuente subrayado
La definición de
_.each
o_.forEach
es la siguiente:Es importante tener en cuenta la segunda declaración aquí
Aquí,
context
se pasa a otro métodooptimizeCb
y la función devuelta desde allí se asigna a laiteratee
que se llama más tarde.Como se puede ver en la definición de método anterior
optimizeCb
, sicontext
no se pasa,func
se devuelve como está. Sicontext
se pasa, la función de devolución de llamada se llama comofunc
Se llama con elcall()
que se utiliza para invocar un método estableciendo elthis
contexto del mismo. Entonces, cuandothis
se usa adentrofunc
, se referirá acontext
.Puede considerarlo
context
como el último parámetro opcionalforEach
en JavaScript.fuente