W pliku JavaScript widziałem:
function Somefunction(){
var that = this;
...
}
Jaki jest cel zadeklarowania that
i przypisania this
tego do niego?
javascript
this
Chris
źródło
źródło
Odpowiedzi:
Zacznę tę odpowiedź od ilustracji:
Moja odpowiedź pierwotnie wykazała to za pomocą jQuery, który tylko nieznacznie się różni:
Ponieważ
this
często zmienia się po zmianie zakresu przez wywołanie nowej funkcji, nie można uzyskać dostępu do pierwotnej wartości za jej pomocą. Aliasing dothat
pozwala nadal uzyskać dostęp do pierwotnej wartościthis
.Osobiście nie lubię używania
that
jako aliasu. Rzadko jest oczywiste, do czego się odnosi, szczególnie jeśli funkcje są dłuższe niż kilka linii. I zawsze używać bardziej opisowego alias. W powyższych przykładach prawdopodobnie użyłbymclickedEl
.źródło
var self = this;
. Słowothat
wydaje się sugerować, że zmienna jest Cokolwiek, ALEthis
.forEach
Funkcji zajmuje drugi opcjonalny argument, który jest wiązanie funkcji.colours.forEach(function(){/* 'this' is bound correctly --> */}, this);
Tak więc należy dodać notatkę, któravar that = this
tak naprawdę nie jest potrzebnaforEach
.Z Crockford
JS Fiddle
To ostrzega ...
źródło
that
zmienna w ogóle nie jest użyta w jego przykładzie. Wygląda na to, że samo utworzenie zmiennej zmiennejthis
ma wpływ na resztę kodu.To jest hack, aby funkcje wewnętrzne (funkcje zdefiniowane wewnątrz innych funkcji) działały bardziej tak, jak powinny. W javascript, gdy zdefiniujesz jedną funkcję w innej,
this
automatycznie ustawi się na zasięg globalny. Może to być mylące, ponieważ oczekujethis
się, że będzie miała taką samą wartość jak w funkcji zewnętrznej.Jest to szczególnie problem, gdy tworzysz funkcję jako metodę obiektu (jak
car.start
w przykładzie), a następnie tworzysz funkcję wewnątrz tej metody (jakactivateStarter
). W metodzie najwyższego poziomuthis
wskazuje na obiekt, jest to metoda (w tym przypadkucar
), ale w funkcji wewnętrznejthis
wskazuje teraz na zasięg globalny. To jest ból.Utworzenie zmiennej do użycia zgodnie z konwencją w obu zakresach jest rozwiązaniem tego bardzo ogólnego problemu z javascript (chociaż jest także użyteczny w funkcjach jquery). Właśnie dlatego bardzo ogólna brzmiąca nazwa
that
używana jest . Jest to łatwo rozpoznawalna konwencja w przezwyciężaniu niedociągnięć w języku.Jak El Ronnoco w Douglas Crockford uważa, że to dobry pomysł.
źródło
Użycie
that
nie jest tak naprawdę konieczne, jeśli obejdziesz to za pomocącall()
lubapply()
:źródło
Czasami
this
może odnosić się do innego zakresu i odnosić się do czegoś innego, na przykład załóżmy, że chcesz wywołać metodę konstruktora wewnątrz zdarzenia DOM, w tym przypadkuthis
odniesie się do elementu DOM, a nie do utworzonego obiektu.HTML
JS
Próbny
Rozwiązanie powyżej woli assing
this
abythat
następnie możemy i mienia Nazwa dostępu wewnątrzsayHi
metody zthat
, tak to można nazwać bez problemów wewnątrz zaproszenia DOM.Innym rozwiązaniem jest przypisanie pustego
that
obiektu oraz dodanie do niego właściwości i metod, a następnie zwrócenie go. Ale dzięki temu rozwiązaniu straciłeśprototype
konstruktora.źródło
Oto przykład `
Możesz więc zobaczyć, że ta wartość to dwie różne wartości w zależności od elementu DOM, na który celujesz, ale dodając „to” do powyższego kodu, zmieniasz wartość „tego”, na który celujesz.
..... $ (that) .css („kolor tła”, „# ffe700”); // Tutaj wartością „tego” jest „.our-work-group> p> a”, ponieważ wartość var that = this; więc mimo tego, że jesteśmy w „this” = '.our-work-single-page ”, nadal możemy użyć„ tego ”do manipulowania poprzednim elementem DOM.
źródło