W źródle prezentacji WebKit HTML 5 SQL Storage Notes zobaczyłem następujące informacje :
function Note() {
var self = this;
var note = document.createElement('div');
note.className = 'note';
note.addEventListener('mousedown', function(e) { return self.onMouseDown(e) }, false);
note.addEventListener('click', function() { return self.onNoteClick() }, false);
this.note = note;
// ...
}
Autor używa self w niektórych miejscach (ciało funkcji), a to w innych miejscach (ciała funkcji zdefiniowanych na liście argumentów metod). Co się dzieje? Teraz, kiedy to zauważyłem, czy zacznę widzieć wszędzie?
javascript
scope
closures
Thomas L. Holaday
źródło
źródło
this
wywołania zwrotnego?”)Odpowiedzi:
Zobacz ten artykuł na alistapart.com . (Ed: artykuł został zaktualizowany od czasu pierwotnego połączenia)
self
jest używany do zachowania odniesienia do oryginału,this
nawet gdy zmienia się kontekst. Jest to technika często stosowana w procedurach obsługi zdarzeń (szczególnie w zamknięciach).Edycja: Zauważ, że używanie
self
jest odradzane, ponieważwindow.self
istnieje i może powodować błędy, jeśli nie będziesz ostrożny.To, co nazywamy zmienną, nie ma szczególnego znaczenia.
var that = this;
jest w porządku, ale w nazwie nie ma nic magicznego.Funkcje zadeklarowane w kontekście (np. Wywołania zwrotne, zamknięcia) będą miały dostęp do zmiennych / funkcji zadeklarowanych w tym samym zakresie lub powyżej.
Na przykład proste wywołanie zwrotne zdarzenia:
źródło
var that = this;
Myślę, że nazwa zmiennej „ja” nie powinna być już używana w ten sposób, ponieważ współczesne przeglądarki zapewniają zmienną globalną
self
wskazującą na globalny obiekt zwykłego okna lub WebWorkera.Aby uniknąć zamieszania i potencjalnych konfliktów, możesz napisać
var thiz = this
lubvar that = this
zamiast tego.źródło
_this
that
” (do którego mój mózg nigdy się nie przyzwyczai).self
o ile zadeklarujesz ją jakovar
zdolną do zmiany, będzie ona śledzić globalne. Oczywiście, jeśli zapomnisz,var
to też nie będzie działać z żadną inną nazwą.Tak, zobaczysz to wszędzie. Jest to często
that = this;
.Zobacz, jak
self
używane są funkcje wywoływane przez zdarzenia? Miałyby one swój własny kontekst, więcself
są używane do przechowywania tego,this
co weszłoNote()
.Przyczyny
self
są nadal dostępne dla funkcji, mimo że mogą one zostać uruchomione dopiero poNote()
zakończeniu wykonywania funkcji, jest to, że funkcje wewnętrzne uzyskują kontekst funkcji zewnętrznej z powodu zamknięcia .źródło
self
nie ma specjalnego znaczenia. Osobiście wolę używać var o nazwie coś innego niżself
to, że często mnie dezorientuje, ponieważ spodziewam się, że „ja” będzie słowem zastrzeżonym. Więc podoba mi się twoja odpowiedź. I w przykładzie OP wolałbymvar thisNote = this
lub podobnie.Należy również zauważyć, że istnieje alternatywny wzorzec proxy do utrzymywania odniesienia do oryginału
this
w wywołaniu zwrotnym, jeśli nie podoba ci się tenvar self = this
idiom.Ponieważ funkcja może zostać wywołana z danym kontekstem za pomocą
function.apply
lubfunction.call
, możesz napisać opakowanie, które zwraca funkcję, która wywołuje twoją funkcję za pomocąapply
lubcall
za pomocą podanego kontekstu. Zobaczproxy
funkcję jQuery dla implementacji tego wzorca. Oto przykład użycia:var wrappedFunc = $.proxy(this.myFunc, this);
wrappedFunc
może zostać następnie wywołany i będzie miał twoją wersjęthis
jako kontekst.źródło
Jak wyjaśnili inni,
var self = this;
pozwala kodowi w zamknięciu odwoływać się z powrotem do zakresu nadrzędnego.Jednak teraz jest 2018 i ES6 jest szeroko obsługiwany przez wszystkie główne przeglądarki internetowe. The
var self = this;
idiom nie jest tak niezbędny jak kiedyś.Można teraz tego uniknąć
var self = this;
dzięki funkcjom strzałek .W przypadkach, w których użylibyśmy
var self = this
:Możemy teraz używać funkcji strzałki bez
var self = this
:Funkcje strzałek nie mają własnych
this
i po prostu przyjmują obejmujący zakres.źródło
.addEventListender("click", (x) => { console.log(x); });
tego bardzo jasno wyjaśniłeś, jak i dlaczego, i zgadzam się, że używanie funkcji strzałek ma większy sens, ale nadal ... to jest po prostu okropne, leniwe, niechlujne programowanie.Zmienna jest przechwytywana przez funkcje wbudowane zdefiniowane w metodzie.
this
w funkcji odniesie się do innego obiektu. W ten sposób możesz sprawić, by funkcja zawierała odwołanie dothis
zewnętrznego zakresu.źródło
To dziwactwo z JavaScript. Kiedy funkcja jest właściwością obiektu, chętniej zwana metoda, to odnosi się do obiektu. W przykładzie obsługi zdarzenia obiekt zawierający jest elementem, który wywołał zdarzenie. Przy standardowym funkcja jest wywoływana, to będzie odnosić się do globalnego obiektu. Gdy masz zagnieżdżone funkcje jak w przykładzie, to nie odnosi się do kontekstu funkcji zewnętrznej w ogóle. Funkcje wewnętrzne współdzielą zakres z funkcją zawierającą, więc programiści użyją odmian
var that = this
, aby zachować to, czego potrzebują w funkcji wewnętrznej.źródło
W rzeczywistości self jest odniesieniem do okna (
window.self
), dlatego kiedy mówiszvar self = 'something'
że przesłonisz odwołanie do okna dla siebie - ponieważ self istnieje w obiekcie window.To dlatego większość deweloperzy wolą
var that = this
ponadvar self = this;
Tak czy siak;
var that = this;
nie jest zgodne z dobrą praktyką ... zakładając, że Twój kod zostanie później zmieniony / zmodyfikowany przez innych programistów, powinieneś używać najpopularniejszych standardów programistycznych w odniesieniu do społeczności programistówDlatego powinieneś użyć czegoś takiego jak var
oldThis
/var oThis
/ etc - aby być jasnym w swoim zasięgu // .. to nie tyle, ale zaoszczędzi kilka sekund i kilka cykli mózgowychźródło
Jak wspomniano kilka razy powyżej, „jaźń” jest po prostu używane do zachowania odniesienia do „tego” przed wejściem do funkcji. Raz w funkcji „to” odnosi się do czegoś innego.
źródło
thisss.sayHi.call (thatt);
źródło