Eu sou novo no underscore.js. Qual é o propósito de [context]
em _.each()
? Como deve ser usado?
162
Eu sou novo no underscore.js. Qual é o propósito de [context]
em _.each()
? Como deve ser usado?
O parâmetro context apenas define o valor de this
na função do 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);
Exemplo de trabalho: http://jsfiddle.net/a6Rx4/
Ele usa o número de cada membro da matriz que está sendo iterado para obter o item no índice de someOtherArray
, que é representado porthis
desde que passamos como o parâmetro de contexto.
Se você não definir o contexto, this
fará referência ao window
objeto.
someOtherArray[num]
invés dethis[num]
?context
é ondethis
se refere na sua função de iterador. Por exemplo:fonte
O contexto permite que você forneça argumentos no momento da chamada, permitindo fácil personalização de funções auxiliares pré-criadas genéricas.
alguns exemplos:
Mesmo nos exemplos limitados, você pode ver o quão poderoso pode ser um "argumento extra" para criar código reutilizável. Em vez de criar uma função de retorno de chamada diferente para cada situação, geralmente você pode adaptar um auxiliar de baixo nível. O objetivo é ter sua lógica personalizada agrupando um verbo e dois substantivos, com um mínimo de clichê.
É certo que as funções de seta eliminaram muitas das vantagens do "código de golfe" das funções puras genéricas, mas as vantagens semânticas e de consistência permanecem.
Eu sempre adiciono
"use strict"
aos auxiliares para fornecer[].map()
compatibilidade nativa ao transmitir as primitivas. Caso contrário, eles são coagidos a objetos, o que geralmente ainda funciona, mas é mais rápido e seguro ser específico ao tipo.fonte
Uso simples de _.each
Aqui está um exemplo simples que pode ser usado
_.each
:Resultado:
Em vez de ligar
addItem
várias vezes, você pode usar o sublinhado desta maneira:que é idêntico a chamar
addItem
três vezes sequencialmente com esses itens. Basicamente, itera sua matriz e para cada item chama sua função de retorno de chamada anônima que chamax.addItem(item)
. A função de retorno de chamada anônima é semelhante àaddItem
função de membro (por exemplo, leva um item) e é meio inútil. Então, em vez de passar por uma função anônima, é melhor_.each
evitar esse indireto e chamaraddItem
diretamente:mas isso não funcionará, pois a
addItem
função de membro da cestathis
não se refere àx
cesta que você criou. É por isso que você tem a opção de passar sua cestax
para ser usada como[context]
:Exemplo completo que usa _.each e context:
Em resumo, se a função de retorno de chamada que você passar de
_.each
alguma forma usarthis
, será necessário especificar o quethis
deve estar se referindo dentro da sua função de retorno de chamada. Pode parecer quex
é redundante no meu exemplo, masx.addItem
é apenas uma função e pode ser totalmente sem relação comx
oubasket
ou qualquer outro objeto, por exemplo :Em outras palavras, você vincula algum valor a
this
seu retorno de chamada ou pode usar o bind diretamente assim:Em geral, se algum
underscorejs
método usa uma função de retorno de chamada e se você deseja que essa chamada seja chamada em alguma função membro de algum objeto (por exemplo, uma função que usethis
), você poderá vincular essa função a algum objeto ou passar esse objeto como[context]
parâmetro e isso é a intenção primária. E na parte superior da documentação do underscorejs, é exatamente o que eles afirmam: o iterado é vinculado ao objeto de contexto, se um for passadofonte
Conforme explicado em outras respostas,
context
é othis
contexto a ser usado dentro do retorno de chamada passado paraeach
.Vou explicar isso com a ajuda do código fonte de métodos relevantes a partir do código fonte de sublinhado
A definição de
_.each
ou_.forEach
é a seguinte:Segunda declaração é importante notar aqui
Aqui,
context
é passado para outro métodooptimizeCb
e a função retornada é atribuída àiteratee
qual é chamada mais tarde.Como pode ser visto na definição do método acima
optimizeCb
, secontext
não for passado,func
será retornado como está. Secontext
for aprovada, a função de retorno de chamada é chamada comofunc
é chamado com ocall()
qual é usado para chamar um método, definindo othis
contexto dele. Então, quandothis
é usado dentrofunc
, ele se refere acontext
.Você pode considerar
context
como o último parâmetro opcionalforEach
no JavaScript.fonte