Użycie metod instancji jako wywołań zwrotnych dla procedur obsługi zdarzeń zmienia zakres this
z „Moje wystąpienie” na „Cokolwiek, co właśnie wywołało wywołanie zwrotne” . Mój kod wygląda tak
function MyObject() {
this.doSomething = function() {
...
}
var self = this
$('#foobar').bind('click', function(){
self.doSomethng()
// this.doSomething() would not work here
})
}
Działa, ale czy to najlepszy sposób, aby to zrobić? Wygląda mi to dziwnie.
javascript
jquery
scope
closures
defnull
źródło
źródło
self
ponieważ istnieje jakiświndow.self
obiekt i możesz go użyć przypadkowo, jeśli zapomnisz zadeklarować swój własnyself
var (np. Podczas przenoszenia jakiegoś kodu). Może to być denerwujące w wykrywaniu / debugowaniu. Lepiej użyć czegoś takiego_this
.this
JavaScript jest dynamiczna w JavaScript. Jest określana, kiedy funkcja jest wywoływana , a nie kiedy jest deklarowana”.self === this
. Dlategoself
w lokalnych kontekstach ma sens i jest zgodny z tym wzorcem.Odpowiedzi:
To pytanie nie jest specyficzne dla jQuery, ale ogólnie dotyczy JavaScript. Podstawowym problemem jest sposób „channelowania” zmiennej we wbudowanych funkcjach. Oto przykład:
Ta technika polega na użyciu zamknięcia. Ale to nie działa,
this
ponieważthis
jest pseudo zmienną, która może dynamicznie zmieniać się z zakresu na zakres:Co możemy zrobić? Przypisz ją do jakiejś zmiennej i użyj jej przez alias:
this
nie jest pod tym względem wyjątkowy:arguments
to inna pseudo-zmienna, którą należy traktować w ten sam sposób - poprzez aliasing.źródło
Tak, to wydaje się być powszechnym standardem. Niektórzy koderzy używają siebie, inni używają mnie. Jest używany jako odniesienie do „prawdziwego” obiektu, w przeciwieństwie do zdarzenia.
Zajęło mi to trochę czasu, na początku wygląda dziwnie.
Zwykle robię to bezpośrednio na górze mojego obiektu (wybacz mój kod demo - jest bardziej konceptualny niż cokolwiek innego i nie jest lekcją doskonałej techniki kodowania):
źródło
edycja: pomimo tego, zagnieżdżone funkcje w obiekcie przyjmują raczej globalny obiekt okna niż otaczający obiekt.
źródło
var self = this
, że opisujesz, co robi, ale nie o to pyta (pytanie dotyczy tego, czy to najlepsze rozwiązanie problemu).Jeśli wykonujesz ES2015 lub skrypt typu i ES5, możesz użyć funkcji strzałek w kodzie i nie napotykasz tego błędu, a to odnosi się do pożądanego zakresu w Twojej instancji.
źródło
this
z ich zdefiniowanego zakresu. Zwykłe definicje funkcji tego nie robią.Jednym z rozwiązań jest powiązanie całego wywołania zwrotnego z obiektem za pomocą
bind
metody javascript .Możesz to zrobić za pomocą nazwanej metody,
Lub z anonimowym oddzwonieniem
Wykonanie ich zamiast uciekania się do
var self = this
pokazuje, że rozumiesz, jakthis
zachowuje się wiązanie w javascript i nie polega na odwołaniu do zamknięcia.Ponadto operator grubej strzałki w ES6 jest w zasadzie tym samym wywołaniem
.bind(this)
anonimowej funkcji:źródło
Nie korzystałem z jQuery, ale w bibliotece takiej jak Prototype możesz powiązać funkcje z określonym zakresem. Mając to na uwadze, Twój kod wyglądałby tak:
Metoda bind zwraca nową funkcję, która wywołuje oryginalną metodę o określonym zakresie.
źródło
$('#foobar').ready('click', this.doSomething.call(this));
prawda?bind
metoda nie działa w starszych przeglądarkach, więc$.proxy
zamiast tego użyj tej metody.Wystarczy dodać do tego, że w ES6 z powodu funkcji strzałek nie powinieneś tego robić, ponieważ przechwytują
this
wartość.źródło
Myślę, że tak naprawdę zależy to od tego, co zamierzasz zrobić w ramach swojej
doSomething
funkcji. Jeśli chcesz uzyskać dostęp doMyObject
właściwości za pomocą tego słowa kluczowego, musisz go użyć. Ale myślę, że poniższy fragment kodu będzie działał również, jeśli nie robisz żadnych specjalnych rzeczy za pomocąobject(MyObject)
właściwości.źródło