Funkcje w funkcji

K9
  • Rejestracja:około 6 lat
  • Ostatnio:około 5 lat
  • Postów:6
0

Witam serdecznie,
Jestem nowy na forum dlatego jeszcze raz wszystkich witam. Nie wiem czy dobrze zatytułowałem temat. Chciałbym Was prosić o pomoc w wyjaśnieniu jednej rzeczy. Dla Was na pewno to będzie jakiś banał. Chodzi mi o nazwanie po imieniu tego co tu się dzieje. Ja oczywiście spróbuję sam ale prosił bym o korektę jeżeli coś źle z tego zrozumiałem. Mam sobie taką funkcję:

Kopiuj
var a = function() {
    this.x = function() {....};
};
var b = new a();
b.x();

I teraz po kolei. Tworzę sobie funkcję bezargumentową i przypisują ją do jakiegoś var-a którego ja nazwałem 'a'. Następnie wewnątrz tej funkcji tworzona jest kolejna funkcja która przypisywana jest do globalnego kontekstu wykonania który nazywam sobie 'x'. Następnie tworzę konstruktor????? i przypisuję do var-a którego nazwałem 'b' i później poprzez ten konstruktor odwołuję się do funkcji wewnętrznej. Wiem że na pewno nie do końca dobrze to zrozumiałem dlatego proszę serdecznie o wytłumaczenie. Tu nie chodzi słuchajcie o to czy to jest dobrze czy źle i że można zrobić to inaczej lecz o to co w tym fragmencie kodu dokładnie się dzieje :). Z góry pięknie dziękuję za pomoc.

Czy może inaczej. Może to ta funkcja główna przypisana do vara 'a' jest konstruktorem bo przecież za jej pomocą wywoływana jest dopiero funkcja wewnętrzna.

edytowany 1x, ostatnio: kingu95
DE
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 3 lata
  • Postów:50
1

Twoja funkcja "a", to nic innego jak konstruktor coś na wzór klasy w innych językach. Konwencja zakłada, aby takie konstruktory nazywać z dużej litery.
"var b". To obiekt którzy stworzyłeś na bazie konstruktora "a". twoje b.x() to po prostu metoda/funkcja obiektu b.
Podsumowując. Tworzy konstruktor (var a ...), na bazie tego konstruktora tworzysz nowy obiekt, (var b = new a()). Następnie wywołujesz metodę x obiektu b.
Więcej na temat konstruktorów znajdziesz tu: https://kursjs.pl/kurs/obiekty/obiekty-konstruktor.php

K9
  • Rejestracja:około 6 lat
  • Ostatnio:około 5 lat
  • Postów:6
0

W to przypisanie funkcji wewnątrz konstruktora do this.x dobrze zrozumiałem? To jest właśnie przypisanie nowej metody to globalnego kontekstu wywołania?

DE
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 3 lata
  • Postów:50
1

Funkcja/metoda "x" nie będzie miała zasięgu globalnego, nie będziesz mógł zrobić tak:

Kopiuj
var a = function() {
    this.x = function() {....};
};
var b = new a();
x(); // -> x is not defined

Tą metodę będziesz mógł wykonać tylko z poziomu obiektu który stworzysz za pomocą konstruktora. Czyli tak jaka masz w kodzie który wkleiłeś w pierwszym poście. Chociaż nie wiem, co masz na myśli pisząc "globalny kontekst wywołania'

edytowany 1x, ostatnio: debug
K9
  • Rejestracja:około 6 lat
  • Ostatnio:około 5 lat
  • Postów:6
0

Chodzi mi o to przypisanie do 'this'. Bo gdybym zrobił zamiast 'this.x' np var x to już by nie zadziałało. A this to chyba jest właśnie kontekst globalny. Albo po prostu tego nie rozumiem :)

edytowany 1x, ostatnio: kingu95
Delor
this w javascript to ... skomplikowane. To raczej kontekst wywołania funkcji. Nie musi być (i w powyższym przykładzie nie jest) globalny.
DE
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 3 lata
  • Postów:50
0

W tym wypadku this, wskazuje na twoją funkcję/konstruktor "a". A nie na globalne zasięg (Window). Ogólnie z this w javascript trzeba uważać, nie zawsze wskazuje na to czego byśmy się spodziewali.

Haskell
  • Rejestracja:prawie 10 lat
  • Ostatnio:12 miesięcy
  • Postów:4700
1
debug napisał(a):

Ogólnie z this w javascript trzeba uważać, nie zawsze wskazuje na to czego byśmy się spodziewali.

Od czasu es6 this używam tylko w klasach. Unikam brzydkiego kodu, globalnych super obiektów jak w Turbo Pascalu. W związku z tym każdemu polecam się przesiąść na nową wersję.


Zaglądali do kufrów, zaglądali do waliz, nie zajrzeli do d**y - tam miałem socjalizm. Czesław Miłosz

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.