Z dokumentów rozumiem, .proxy()
że zmieniłoby to zakres funkcji przekazanej jako argument. Czy ktoś mógłby mi to lepiej wyjaśnić? Dlaczego powinniśmy to robić?
javascript
jquery
Aditya Shukla
źródło
źródło
Odpowiedzi:
Ostatecznie zapewnia, że wartość
this
w funkcji będzie wartością, której pragniesz.Typowym przykładem jest to,
setTimeout
które ma miejsce wewnątrzclick
procedury obsługi.Weź to:
Zamiar jest dość prosty. Po
myElement
kliknięciu powinien otrzymać klasęaNewClass
. Wewnątrz procedury obsługithis
reprezentuje kliknięty element.Ale co by było, gdybyśmy chcieli krótkiego opóźnienia przed dodaniem klasy? Możemy użyć a,
setTimeout
aby to osiągnąć, ale problem polega na tym, że niezależnie od funkcji, jaką damysetTimeout
, wartośćthis
wewnątrz tej funkcji będziewindow
zamiast naszego elementu.Zatem zamiast tego możemy wywołać
$.proxy()
i wysłać do niej funkcję i wartość, do której chcemy przypisaćthis
, a zwróci to funkcję, która zachowa tę wartość.Więc po tym, jak podaliśmy
$.proxy()
funkcję i żądaną wartośćthis
, zwróciła ona funkcję, która zapewni, żethis
jest poprawnie ustawiona.Jak to się dzieje? Po prostu zwraca anonimową funkcję, która wywołuje naszą funkcję za pomocą
.apply()
metody, która pozwala jawnie ustawić wartośćthis
.Uproszczone spojrzenie na zwracaną funkcję może wyglądać następująco:
Więc ta anonimowa funkcja jest dana
setTimeout
i wszystko, co robi, to wykonanie naszej oryginalnej funkcji w odpowiednimthis
kontekście.źródło
$.proxy(function () {...}, this)
zamiast(function() {...}).call(this)
? Czy jest jakaś różnica?.call
tobą natychmiast wywołujesz funkcję. W$.proxy
przypadku jest to tak, jakbyFunction.prototype.bind
zwracała nową funkcję. Ta nowa funkcja mathis
wartość trwale związany, tak, że gdy jest on przekazywany dosetTimeout
, isetTimeout
wywołuje funkcję później, to nadal mają prawidłowąthis
wartość.Bez wchodzenia w szczegóły (co byłoby konieczne, ponieważ dotyczy to kontekstu w ECMAScript, tej zmiennej kontekstu itp.)
Istnieją trzy różne typy „kontekstów” w ECMA / JavaScript:
Każdy kod jest wykonywany w swoim kontekście wykonania . Jest jeden kontekst globalny i może istnieć wiele przykładów kontekstów funkcyjnych (i ewaluacyjnych). Teraz interesująca część:
Każde wywołanie funkcji wchodzi w kontekst wykonania funkcji. Kontekst wykonania funkcji wygląda następująco:
Łańcuch zakresu obiektu aktywacji
to wartość
Więc ta wartość jest specjalnym obiektem, który jest powiązany z kontekstem wykonania. W ECMA- / Javascript są dwie funkcje, które mogą zmienić tę wartość w kontekście wykonywania funkcji:
Jeśli mamy funkcję
foobar()
, możemy zmienić tę wartość, wywołując:Teraz mogliśmy uzyskać dostęp
foobar
do przekazanego obiektu:Dokładnie to
jQuery.proxy()
robi. Pobierafunction
andcontext
(który jest niczym innym jak obiektem) i łączy funkcję przez wywołanie.call()
lub.apply()
i zwraca tę nową funkcję.źródło
Napisałem tę funkcję:
źródło
Ten sam cel można osiągnąć za pomocą samowykonującej się
funkcji„Natychmiastowo wywoływane wyrażenie funkcyjne, w skrócie: IIFE” :źródło