@diofantos: nie będzie. Mało kto zdaje sobie z tego sprawę, ale świat webowy jest na tyle specyficzny, że próba wejścia w niego jakiegokolwiek języka zniszczyłaby go. Głównym problemem jest kompatybilność wsteczna - w Javie, C# czy każdym innym „normalnym” języku jak twórcom coś się nie podoba, to wyrzucają to z języka i wydają nową wersję kompilatora. W przypadku JSa nie można tak zrobić bo kod musi działać i na starych
@oslet: dokładnie - wystarczy być doświadczonym developerem JS i znać te przypadki, a wszystko jest jasne i klarowne. Świetny język, świetna technologia ( ͡° ͜ʖ ͡°)
@MostlyRenegade no tak, trudno pojąc że this wewnątrz metody obiektu reprezentuje ten obiekt a poza metodami obiektu reprezentuje window (czyli tak naprawdę też obiekt tyle że "domyślny", globalny).
@powaznyczlowiek no chyba nie przeoczyłem, bo co niby? Strict tylko wyłącza widoczność globalnego this/window nic poza tym (w kontekście o którym mowa). A żale o () => wynikają tylko z niezrozumienia czym jest ta konstrukcja.
@oslet: @powaznyczlowiek: wystarczy nie używać this (poza powiedzmy es6 classes) Tak samo powstało pierdyliard memów o tym jakie dziwne wyniki zwraca ==, a to po prostu legacy szajs którego żaden linter nie przepuści.
Pomyliliście dwie kwestie: Za oficjalną dokumentacją ECMA 262, punkt 10 o kontekście wykonania - każde wywołanie funkcji czy też konstruktora tworzy zupełnie nowy kontekst wykonania, w ramach którego określany jest scope czy też determinacja this. Zagnieżdżanie nie ma nic do determinacji this. Istotą jest tutaj co wywołuje funkcję:
The caller provides the this value. If the this value provided by the caller is not an object (including the case where it
@powaznyczlowiek no przecież doit NIE JEST metodą obiektu anObject xD tylko checkThis nią jest. Chyba w każdym popularnym języku programowania, jak w metodzie zagniezdzisz funkcje to this w niej nie będzie już odwoływało się do obiektu.
@MostlyRenegade: Z tym spodziewaniem się, to się akurat zgodzę, bo języki programowania z zaimplementowanym tradycyjnym oop mogą sugerować takie działanie, a jak dobrze wiemy, w JS w wielu kwestiach pewne rzeczy są inaczej zaimplementowane, np. obiektówka przez prototypowanie. Ja w swoich wypowiedziach piłem bardziej do tego, że gość z filmu sie zesrał nad magią... która jest opisana w specyfikacji języka. :) Ja kodziłem zawodowo w C#, PHP, teraz JS i
@powaznyczlowiek: Kuźwa, a ty dalej swoje. :P Kontekst wykonania nie ma związku z zagnieżdżaniem JS. Ty tego nie wiesz i typ z filmu też nie, osletowi, też się pofandzoliło. Ile jeszcze o tym zagnieżdżaniu będziecie pisać? Kontekst wykonania zależny jest tylko i wyłącznie od tego co wywołuje funkcję, a nie jaki kontekst aktualnie ma to coś co wywołuje. Jeśli nie jest to odpowiedni obiekt, to this zawsze będzie resetowany do
Jeszcze na szybko przykład dla pewności, co sobie można w przeglądarce czy też na repl.it odpalić. Za oficjalną specyfikacją dot. kontekstu wykonania, że nie jest przekazywany przez scoping itd., lecz jest tworzony każdorazowo, nawet w przypadku rekursywnego wywołania funkcji i ważnym jest co wywołuje daną funkcję to dla kodu:
@MostlyRenegade: this pokazuje nie na x, tylko {}. Inaczej. Za pierwszym razem pokazuje się false, bo przy pierwszym wywoływaniu x'a callerem jest {}, który jest obiektem prawidłowym do zbindowania thisa w x. Kolejne wywołania x'a są realizowane przez x'a, który jest funkcją, która nie jest bindowalna do thisa, więc kontekst jest resetowany do globala.
Jeszcze dopowiem, że funkcja strzałkowa (i to wynika ze specyfikacji i zamierzenia jej działania w JS) jest wykonywana w ramach aktualnego kontekstu wykonania (nie jest tworzony nowy kontekst), więc jest niebindowalna i this jest tutaj zachowywany z "poziomu wyżej".
Wy chyba nie rozumiecie, że to z tych wszystkich "wystarczy nie używać...", "wystarczy rozumieć że..." jest największa beka xD
W normalnym języku programowania bierzesz wersję X i w tej wersji wszystko działa w dany sposób i koniec - używasz, masz dokumentację i po temacie.
A w JavaScript masz coś co działa tak, ale może też działać inaczej, ale "należy też pamiętać że" - i tak w nieskończoność, aż
this(poza powiedzmy es6 classes) Tak samo powstało pierdyliard memów o tym jakie dziwne wyniki zwraca==, a to po prostu legacy szajs którego żaden linter nie przepuści.Pomyliliście dwie kwestie: Za oficjalną dokumentacją ECMA 262, punkt 10 o kontekście wykonania - każde wywołanie funkcji czy też konstruktora tworzy zupełnie nowy kontekst wykonania, w ramach którego określany jest scope czy też determinacja this. Zagnieżdżanie nie ma nic do determinacji this. Istotą jest tutaj co wywołuje funkcję:
The caller provides the this value. If the this value provided by the caller is not an object (includingthe case where it
const global = this;
let x;
x
Komentarz usunięty przez autora