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 thisen 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 thisdesde que lo pasamos como parámetro de contexto.
Si no establece el contexto, thisse referirá al windowobjeto.
someOtherArray[num]más quethis[num]?contextes donde sethisrefiere 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
addItemvarias veces , puede usar subrayado de esta manera:que es idéntico a llamar
addItemtres 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 laaddItemfunció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_.eachevite esta indirección y llameaddItemdirectamente:pero esto no funcionará, ya que la
addItemfunción miembro dentro de la cestathisno se referirá a laxcesta que creó. Es por eso que tiene la opción de pasar su canastaxpara 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
_.eachalguna manera usa,thisentonces debe especificar a quéthisdebería referirse dentro de su función de devolución de llamada. Puede parecer quexes redundante en mi ejemplo, perox.addItemes sólo una función y podría ser totalmente ajenos axobasketo cualquier otro objeto, por ejemplo :En otras palabras, enlaza algún valor
thisdentro de su devolución de llamada, o bien puede usar el enlace directamente de esta manera:En general, si algún
underscorejsmé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,
contextes elthiscontexto 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
_.eacho_.forEaches la siguiente:Es importante tener en cuenta la segunda declaración aquí
Aquí,
contextse pasa a otro métodooptimizeCby la función devuelta desde allí se asigna a laiterateeque se llama más tarde.Como se puede ver en la definición de método anterior
optimizeCb, sicontextno se pasa,funcse devuelve como está. Sicontextse pasa, la función de devolución de llamada se llama comofuncSe llama con elcall()que se utiliza para invocar un método estableciendo elthiscontexto del mismo. Entonces, cuandothisse usa adentrofunc, se referirá acontext.Puede considerarlo
contextcomo el último parámetro opcionalforEachen JavaScript.fuente