Wpis z mikrobloga

  • 0
@powaznyczlowiek doit nie należy do zbioru metod obiektu. Ty wiesz czym jest metoda obiektu? Funkcja zagnieżdżona w metodzie obiektu nie jest metodą tego obiektu. Tak będziesz miał w praktycznie KAŻDYM języku, to nie jest żadna cecha szczególna JS.
  • Odpowiedz
konto usunięte via Wykop Mobilny (Android)
  • 0
@oslet: no ok ja to rozumiem - w takim razie jeśli w metodzie tego obiektu zrobię inny zagnieżdżony obiekt i w jego konstruktorze odwołam się do this to też będę tam miał Window skoro ten obiekt nie należy do zbioru pół i metod tego nadrzędnego? ( ͡° ͜ʖ ͡°)
  • Odpowiedz
  • 0
@powaznyczlowiek podaj przykład bo nie wiem czy rozumiem co masz na myśli. ale z tego co opisałeś to this będzie reprezentowało obiekt do którego należy ten konstruktor (ten podrzędny obiekt). Nie wiem skąd sobie wziąłeś wniosek że window. Gdzie tu jakas sprzeczność z tym co pisałem?

I ponownie - tak jest w każdym znanym mi języku. Gdzie tu ta dziwaczność jsa?
  • Odpowiedz
Funkcja zagnieżdżona w metodzie obiektu nie jest metodą tego obiektu


@oslet: w C# jeśli zrobisz funkcję zagnieżdżoną w metodzie klasy, to wewnątrz tej funkcji this wskazuje na obiekt tej klasy.
I to jest zachowanie, którego ja osobiście bym się właśnie spodziewał.
  • Odpowiedz
@powaznyczlowiek @oslet

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
  • Odpowiedz
@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
  • Odpowiedz
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:

const global = this;

let x;

x
  • Odpowiedz
konto usunięte via Wykop Mobilny (Android)
  • 0
@oslet: czyli zagnieżdżony obiekt wiąże do siebie, ale zagnieżdżona funkcja do defaultowego Window, chyba że to "funkcja strzałkowa" to jednak to obiektu, który w tle tworzy lub inny z trzech przypadków przedstawionych na filmie albo 30 nie przedstawionych - przecież dobrze wiesz, że o takich absurdach cale wątki i artykuły powstają ( ͡° ͜ʖ ͡°)

Nie ma żadnej sprzeczności z tym co piszesz - po prostu
  • Odpowiedz
@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
  • Odpowiedz
@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.
  • Odpowiedz
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".
  • Odpowiedz
@MostlyRenegade: Tak. A precyzyjniej, poprzez funkcję call określasz jaki obiekt wywołuje tę funkcje. Może być on zupełnie z czapy, ale dla silnika jest to wystarczające by ustanowić go kontekstem dla tego konkretnego jednego wywołania funcji. Natomiast bind domyślnie wiąże jakiś inny obiekt, tak jak zdefiniowanie początkowe funkcji w obiekcie - niejawnie definiuje obiekt kontekstu wykonania dla funkcji. Właśność nie ma tu żadnego znaczenia.
  • Odpowiedz
@powaznyczlowiek: Nie będę ukrywał, że sam alfą i omegą z JS nie jestem i też muszę się posiłkować dokumentacją, ale takie długie tłumaczenie nie wynika z tego, że JS jest strasznie zawiły, lecz z tego iż implementuje on zupełnie inaczej obiektowość w stosunku do języków c-podobnych, a implementuje przez prototypowanie i tak, jest językiem obiektowym. Mało tego, w JS nawet dodane klasy w ES6 na wzór tradycyjnej obiektówki to tak
  • Odpowiedz