Jestem nowy w underscore.js. Jaki jest cel [context]
w _.each()
? Jak należy tego używać?
162
Jestem nowy w underscore.js. Jaki jest cel [context]
w _.each()
? Jak należy tego używać?
Parametr context ustawia po prostu wartość this
w funkcji iteratora.
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);
Przykład roboczy: http://jsfiddle.net/a6Rx4/
Używa liczby z każdego elementu składowego tablicy, która jest iterowana, aby uzyskać element o tym indeksie someOtherArray
, który jest reprezentowany przez, this
ponieważ przekazaliśmy go jako parametr kontekstu.
Jeśli nie ustawisz kontekstu, this
będzie odnosić się do window
obiektu.
someOtherArray[num]
zamiastthis[num]
?context
gdziethis
odwołuje się do funkcji iteratora. Na przykład:źródło
Kontekst umożliwia dostarczanie argumentów w czasie wywołania, umożliwiając łatwe dostosowywanie ogólnych wstępnie zbudowanych funkcji pomocniczych.
kilka przykładów:
Nawet na podstawie ograniczonych przykładów widać, jak potężny może być „dodatkowy argument” przy tworzeniu kodu wielokrotnego użytku. Zamiast tworzyć inną funkcję zwrotną dla każdej sytuacji, zwykle można dostosować pomocnika niskiego poziomu. Celem jest, aby Twoja niestandardowa logika obejmowała czasownik i dwa rzeczowniki przy minimalnym schemacie.
Wprawdzie funkcje strzałkowe wyeliminowały wiele zalet „kodu golfowego” ogólnych funkcji czystych, ale zalety semantyczne i spójności pozostają.
Zawsze dodaję
"use strict"
do pomocników, aby zapewnić natywną[].map()
zgodność podczas przekazywania prymitywów. W przeciwnym razie są przekształcane w obiekty, co zwykle nadal działa, ale szybciej i bezpieczniej jest określić typ.źródło
Proste użycie _.each
Oto prosty przykład , którego można użyć
_.each
:Wynik:
Zamiast dzwonić
addItem
wiele razy, możesz użyć podkreślenia w ten sposób:co jest identyczne z wywołaniem
addItem
trzykrotnego sekwencyjnego połączenia z tymi elementami. Zasadniczo iteruje twoją tablicę i dla każdego elementu wywołuje twoją anonimową funkcję zwrotną, która wywołujex.addItem(item)
. Anonimowa funkcja zwrotna jest podobna doaddItem
funkcji składowej (np. Pobiera element) i jest trochę bezcelowa. Więc zamiast przechodzić przez funkcję anonimową, lepiej jest_.each
unikać tego pośrednictwa i wywoływaćaddItem
bezpośrednio:ale to nie zadziała, ponieważ
addItem
funkcja elementu członkowskiego wewnątrz koszykathis
nie będzie odnosić się do Twojegox
koszyka, który utworzyłeś. Dlatego masz możliwość przekazania swojego koszykax
do wykorzystania jako[context]
:Pełny przykład wykorzystujący _.each i kontekst:
Krótko mówiąc, jeśli funkcja zwrotna, do której
_.each
w jakikolwiek sposób przekazujesz, używathis
, musisz określić, do czegothis
powinno się odnosić wewnątrz funkcji zwrotnej. Może wydawać sięx
to zbędne w moim przykładzie, alex.addItem
jest po prostu funkcją i może być całkowicie niezwiązanex
lubbasket
lub jakiegokolwiek innego obiektu, na przykład :Innymi słowy, możesz przypisać jakąś wartość do
this
swojego wywołania zwrotnego lub równie dobrze możesz użyć bind bezpośrednio w ten sposób:Ogólnie, jeśli jakaś
underscorejs
metoda przyjmuje funkcję zwrotną i jeśli chcesz, aby ta funkcja zwrotna była wywoływana na jakiejś funkcji składowej jakiegoś obiektu (np. Funkcji, która używathis
), możesz powiązać tę funkcję z jakimś obiektem lub przekazać ten obiekt jako[context]
parametr i to jest pierwotny zamiar. A na początku dokumentacji podkreślenia, dokładnie to stwierdzają: iterat jest powiązany z obiektem kontekstu, jeśli taki jest przekazywanyźródło
Jak wyjaśniono w innych odpowiedziach,
context
jestthis
kontekst, który ma być używany w wywołaniu zwrotnym przekazywanym doeach
.Wyjaśnię to za pomocą kodu źródłowego odpowiednich metod z podkreślonego kodu źródłowego
Definicja
_.each
lub_.forEach
jest następująca:Warto zwrócić uwagę na drugie stwierdzenie
Tutaj
context
jest przekazywana do innej metody,optimizeCb
a zwracana przez nią funkcja jest następnie przypisywana doiteratee
której jest wywoływana później.Jak widać z powyższej definicji metody
optimizeCb
, jeślicontext
nie jest przekazywane, tofunc
jest zwracane bez zmian . Jeślicontext
jest przekazywane, funkcja zwrotna jest wywoływana jakofunc
jest wywoływana, za pomocącall()
której jest używana do wywołania metody poprzez ustawienie jejthis
kontekstu. Więc kiedythis
jest używany w środkufunc
, będzie odnosić się docontext
.Możesz rozważyć
context
jako ostatni opcjonalny parametrforEach
w JavaScript.źródło