Ta strona używa ciasteczek (cookies), dzięki którym nasz serwis może działać lepiej. Dowiedz się więcej OK, rozumiem

operator new + self-invoking functions

Tworzenie dynamicznych stron internetowych z zastosowaniem JavaScript, jQuery, Ajax. Dowiedz się jak to zrobić, znajdź rozwiązania swoich problemów.

operator new + self-invoking functions

Post 07.09.2017, 14:32:56

Czesc,

Spotkałem niedawno konstrukcję, którą dla uproszczenia zdefiniuję jako:

Kod: Zaznacz cały
var foo = new (function(){
    this.name = "Ania"
})


Utworzy mi to nowy obiekt, aczkolwiek nie rozumiem w jaki sposób. Operatora new używa się z funkcją - ok, w sumie funkcję mamy. Ale funkcja ta wpierw się wykona i zostanie nam zwrócony undefined (co innego gdyby została nam zwrócona funkcja), zatem nie ma na czym zrobić new. Czegos nie łapię, proszę o sprostowanie.

Dziękuję,
Pozdrawiam!
whitty
Posty: 86
Dołączył(a): 12.07.2015

Re: operator new + self-invoking functions

Post 07.09.2017, 14:55:07

ok, w sumie funkcję mamy. Ale funkcja ta wpierw się wykona

w tym kodzie nie widzę wykonania funkcji, chyba, że zjadłeś jeszcze () na końcu. Na dowód, usuń z tego kodu operator new i daj na koniec console.log(foo); i zobacz co jest wartością zmiennej foo.

Ale gdyby dodać () na końcu to i tak to nic nie zmieni. Chodzi o to, że notacja ta zostanie zinterpretowana jako
Kod: Zaznacz cały
MemberExpression : new MemberExpression Arguments
(https://es5.github.io/#x11.2.2), czyli mamy operator new, po którym mamy konstruktor
Kod: Zaznacz cały
(function () { this.name = 'Ania'; })

po którym mamy argumenty (w tym wypadku pusta lista argumentów)
Kod: Zaznacz cały
()
więc interpreter będzie kontynuował zgodnie z logiką działania operatora new.

W telegraficznym skrócie, w tym kodzie mamy jedną operację – wywołanie operatora new wraz z przekazaniem mu 2 parametrów - konstruktora oraz listy argumentów i to wynika ze składni, która wyglądem mocno przypomina tradycyjne wywołanie funkcji, stąd możliwe nieporozumienie, że mamy 2 niezależne operacje - wywołanie funkcji i przekazanie jej wyniku do operatora new.

Jeśli chciałbyś wywołać funkcję i jej wynik przekazać do operatora new, to możesz nawiasy z parametrami" przesunąć do środka tych pozostałych nawiasów

Kod: Zaznacz cały
var foo = new (function(){
    this.name = "Ania"
}());

w tym wypadku powinieneś dostać błąd, że "(intermediate value)(...) is not a constructor")
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19571
Dołączył(a): 14.04.2002

Re: operator new + self-invoking functions

Post 08.09.2017, 13:34:52

Dziękuję Kuku za odpowedź.

Czy zatem dobrze rozumiem, jezeli chodzi o kolejnosc tworzenia się konstruktora - w przypadku operatora new wpierw brana jest pod uwagę funkcja, a poźniej przekazywane są argumenty? Po prostu uważałem, że w przypadku funkcji samowywołującej sie, kolejnosc bedzie inna. Czyli wpierw sie funkcja wykona, a pozniej wkracza do akcji operator new.

Pozdrawiam!
whitty
Posty: 86
Dołączył(a): 12.07.2015

Re: operator new + self-invoking functions

Post 08.09.2017, 13:46:46

Po prostu uważałem, że w przypadku funkcji samowywołującej sie, kolejnosc bedzie inna.

tak jak napisałem, składnia jest myląca, bo bardzo przypomina wywołanie funkcji, po prostu traktuj new funkcja argumenty jako jedną całość, której zachowanie jest opisane w podlinkowanej części specyfikacji, zaś fragment

Kod: Zaznacz cały
(function () { })


zwraca funkcję, więc notacja operatora new jest spełniona.
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19571
Dołączył(a): 14.04.2002


Powrót do JavaScript


 


  • Podobne wątki
    Odpowiedzi
    Wyświetlone
    Ostatni post

Kto przegląda forum

Użytkownicy przeglądający ten dział: Bing [Bot], Google Adsense [Bot] i 9 gości

Hosting, Domeny, SSL

Subskrypcja

Mamy 50330 zarejestrowanych użytkowników.
Najnowszy użytkownik: Bonik


Nasi użytkownicy napisali:

  • 935472 wiadomości
  • w 246488 tematach

Najnowsze wpisy na blogu

Najnowsze artykuły

Najaktywniejsi (ostatnie 30 dni)