Myślałem, że byłoby to coś, co mógłbym łatwo znaleźć w Google, ale może nie zadaję właściwego pytania ...
Jak ustawić cokolwiek „to” odnosi się do danej funkcji javascript?
na przykład, podobnie jak w przypadku większości funkcji jQuery, takich jak:
$(selector).each(function() {
//$(this) gives me access to whatever selector we're on
});
Jak pisać / wywoływać własne samodzielne funkcje, które mają odpowiednie „to” odniesienie po wywołaniu? Używam jQuery, więc jeśli istnieje specyficzny dla jQuery sposób, byłoby to idealne.
javascript
jquery
scope
this
użytkownik126715
źródło
źródło
$.proxy
Odpowiedzi:
JavaScript
.call()
i.apply()
metody pozwalają ustawić kontekst dla funkcji.Teraz możesz zadzwonić:
Co by zaalarmowało
FOO
. Odwrotnie, przekazywanieobj_b
byłoby ostrzeżeniemBAR!!
. Różnica między.call()
i.apply()
polega na tym, że.call()
pobierana jest lista rozdzielona przecinkami, jeśli przekazujesz argumenty do swojej funkcji i.apply()
potrzebujesz tablicy.Dlatego możesz łatwo napisać funkcję
hook
za pomocąapply()
metody. Na przykład chcemy dodać funkcję do.css()
metody jQuerys . Możemy zapisać oryginalne odwołanie do funkcji, zastąpić funkcję niestandardowym kodem i wywołać zapisaną funkcję.Ponieważ magiczny
arguments
obiekt jest obiektem podobnym do tablicy, możemy go po prostu przekazaćapply()
. W ten sposób gwarantujemy, że wszystkie parametry zostaną przekazane do oryginalnej funkcji.źródło
obj_a
, możesz na przykład utworzyć jej kopięvar boud_myfunc = myfunc.bind(obj_a)
i po prostu zadzwonićbound_myfunc()
w razie potrzeby.Użyj
function.call
:Gdzie
that
jest obiekt, który ma byćthis
w funkcji.źródło
function
jest zastrzeżonym słowem kluczowym; rozważ zaktualizowanie swojej odpowiedzi, aby zawierała nazwaną funkcję, ponieważfunction.call(...)
jest to niepoprawny JavaScript.jQuery używa
.call(...)
metody do przypisania bieżącego węzła dothis
funkcji przekazywanej jako parametr.EDYTOWAĆ:
Nie bój się zaglądać do kodu jQuery, gdy masz wątpliwości, wszystko jest w przejrzystym i dobrze udokumentowanym JavaScript.
tzn .: odpowiedź na to pytanie jest około linii 574,
callback.call( object[ name ], name, object[ name ] ) === false
źródło
Możesz użyć funkcji powiązania, aby ustawić kontekst
this
funkcji.źródło
Kolejny podstawowy przykład:
Nie działa:
Pracujący:
Więc w zasadzie: po prostu dodaj .bind (this) do swojej funkcji
źródło