Nie mogę sobie poradzić z konkretnym przypadkiem wyznaczania zmiennych JavaScript. W odróżnieniu od innych przykładów i pytań, które znalazłem, interesuję się zasięgiem zagnieżdżonych funkcji.Skalowanie lokalne lokacji lokalnej: var vs.
Podałem przykład pod adresem this JSFiddle. Właściwa część jest następująca:
function MyObject() {
var self = this;
var a = 1;
this.b = 2;
var innerMethod = function() {
//1 and 2: direct reference
logMessage("a = " + a); // a = 1
//logMessage("b = " + b); // Error: b is not defined
//3 and 4: using this
logMessage("this.a = " + this.a); // this.a = undefined
logMessage("this.b = " + this.b); // this.b = undefined
//5 and 6: using self
logMessage("self.a = " + self.a); // self.a = undefined
logMessage("self.b = " + self.b); // self.b = 2
}
}
Teraz rozumiem, że odniesienie do a
działa bezpośrednio. Rozumiem również, że komunikaty 3 i 4 (this.a
i this.b
) nie powiodą się, ponieważ this
odnosi się do funkcji wewnętrznej. Rozumiem również, że wiersz 6 działa, ponieważ zapisuję odniesienie do oryginalnego obiektu.
Co ja nie rozumiem:
- dlaczego nie są komunikaty 1 i 2 pracują jednakowo?
- dlaczego wiadomości 5 i 6 nie działają tak samo?
Dlaczego mieliby działać podobnie? Wygląda na to, że robisz analogię z Javą lub jakimś innym językiem, w którym "this" przestrzeń nazw jest niejawna, co nie ma miejsca w przypadku JS. –
@ FabrícioMatté Mogę być nieprzytomny robiąc to (kalambur przeznaczony). Nie rozumiem, czy zakresy powinny automatycznie wystawiać zmienne/członków na członków wewnętrznych. Wygląda na to, że tak nie jest, ponieważ nie jest spójny. – Alpha
@Alpha Porównywasz zmienne ('var a = 5;') z rzeczami, które nie są zmiennymi, ale właściwościami obiektów ('this.b = 10;' ustawia właściwość 'b' obiektu, który' this' odnosi do "10"). Te rzeczy nie są takie same i dlatego nie zachowują się identycznie. – Niko