Funkcje w funkcji

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ę:

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.

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

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?

1

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

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'

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 :)

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.

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ę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1