Back to Question Center
0

Funkcje JavaScript, które definiują i przepisują się            Funkcje JavaScript, które definiują i redagują same Tematy: APIsReactTools & LibrariesnpmRaw Semalt

1 answers:
Funkcje JavaScript, które definiują i przepisują się

Funkcje JavaScript, które definiują i przepisują sięFunkcje JavaScript, które definiują i redagują same Tematy:
APIsReactTools & LibrariesnpmRaw Semalt

Poniżej znajduje się krótki fragment naszej nowej książki, JavaScript: Nowicjusz do Ninja, 2nd Edition, napisany przez Darrena Jonesa. To najlepszy przewodnik dla początkujących na temat JavaScript. Członkowie SitePoint Semalt mają dostęp do swoich członków, lub możesz kupić ich kopię w sklepach na całym świecie - cheap windows servers.

Dynamiczna natura JavaScriptu oznacza, że ​​funkcja jest w stanie nie tylko wywołać samą siebie, ale sama się zdefiniować, a nawet na nowo zdefiniować. Odbywa się to poprzez przypisanie funkcji anonimowej do zmiennej, która ma tę samą nazwę co funkcja .

Zaszereguj następującą funkcję:

     funkcja party    {konsola. log ("Wow, to jest niesamowite!");party = function    {konsola. log ("Byłem tam, dostałem koszulkę");}}    

Loguje komunikat w konsoli, a następnie redefiniuje się, aby rejestrować inny komunikat w konsoli. Gdy funkcja zostanie wywołana raz, będzie ona wyglądać tak, jakby została zdefiniowana w następujący sposób:

     funkcja party    {konsola. log ("Byłem tam, dostałem koszulkę");}    

Za każdym razem, gdy funkcja zostanie wywołana po raz pierwszy, zarejestruje ona wiadomość "Byłem tam, dostał koszulkę":

     partia   ;<< Wow, to jest niesamowite!przyjęcie  ;<< 'Byłem tam, dostałem koszulkę'przyjęcie  ;<< 'Byłem tam, dostałem koszulkę'    

Jeśli funkcja jest również przypisana do innej zmiennej, ta zmienna zachowa oryginalną definicję funkcji i nie zostanie przepisana ponownie. Dzieje się tak dlatego, że pierwotna funkcja jest przypisana do zmiennej, a następnie do funkcji przypisywana jest inna funkcja o tej samej nazwie co funkcja. Możesz zobaczyć przykład, jeśli utworzymy zmienną o nazwie beachParty , która jest przypisana do funkcji party przed jest wywoływana po raz pierwszy i na nowo:

     funkcja party    {konsola. log ("Wow, to jest niesamowite!");party = function    {konsola. log ("Byłem tam, dostałem koszulkę");}}const beachParty = party; // zauważ, że funkcja party nie została wywołanaImpreza na plaży  ; // Funkcja party    została teraz ponownie zdefiniowana, mimo że nie została wywołana jawnie<< Wow, to jest niesamowite!przyjęcie  ;<< 'Byłem tam, dostałem koszulkę'Impreza na plaży  ; // ale ta funkcja nie została ponownie zdefiniowana<< Wow, to jest niesamowite!Impreza na plaży  ; // niezależnie od tego, ile razy to się nazywa, pozostanie bez zmian<< Wow, to jest niesamowite!    

Utrata właściwości

Zachowaj ostrożność: jeśli jakieś właściwości zostały wcześniej ustawione na funkcji, zostaną utracone, gdy funkcja przedefiniuje się sama. W poprzednim przykładzie możemy ustawić właściwość muzyki i zobaczymy, że nie istnieje już po wywołaniu funkcji i jej ponownym zdefiniowaniu:

     funkcja party    {konsola. log ("Wow, to jest niesamowite!");party = function    {konsola. log ("Byłem tam, dostałem koszulkę");}}przyjęcie. music = 'Classical Jazz'; // ustaw właściwość funkcjiprzyjęcie  ;<< "Wow, to jest niesamowite!"przyjęcie. muzyka; // funkcja została teraz zdefiniowana na nowo, więc ta właściwość nie istnieje<< undefined     

Nazywa się to Leniwym Wzorem Definicji i jest często używany, gdy kod inicjujący jest wymagany przy pierwszym wywołaniu. Oznacza to, że inicjalizację można wykonać przy pierwszym jej wywołaniu, a następnie można ją ponownie zdefiniować do tego, jaka ma być dla każdej kolejnej inwokacji. Umożliwia to skuteczniejsze działanie funkcji w przeglądarce i unikanie sprawdzania funkcji za każdym razem, gdy są wywoływane.

Weźmy przykład naszego fikcyjnego jednorożca obiektu, który jeszcze nie ma pełnego wsparcia we wszystkich przeglądarkach. W ostatnim rozdziale przyjrzeliśmy się, jak możemy użyć funkcji wykrywania obiektów, aby sprawdzić, czy jest ona obsługiwana. Teraz możemy pójść o krok dalej: możemy zdefiniować funkcję na podstawie tego, czy pewne metody są obsługiwane. Oznacza to, że po uruchomieniu funkcji wystarczy sprawdzić wsparcie:

     function ride    {if (window. unicorn) {ride = function    {// jakiś kod wykorzystujący zupełnie nowe i świecące metody jednorożcapowrót "Jazda na jednorożcu jest najlepsza!";}} else {ride = function    {// jakiś kod używający starszych metod na ponypowrót "Jazda na kucyku jest nadal całkiem dobra";}}return ride   ;}    

Po sprawdzeniu, czy okno . istnieje obiekt jednorożca (sprawdzając, czy jest to prawda), przepisaliśmy funkcję ride zgodnie z wynikiem. Dokładnie na końcu tej funkcji wywołujemy ją ponownie, aby teraz przepisana funkcja została wywołana i zwrócono odpowiednią wartość. Należy pamiętać, że funkcja jest wywoływana dwukrotnie za pierwszym razem, chociaż staje się ona bardziej efektywna przy każdym następnym wywołaniu. Rzućmy okiem na to, jak to działa:

     ride   ; // funkcja przepisuje się sama, a następnie sama się nazywa<< "Jazda na kucyku jest nadal całkiem dobra"    

Po wywołaniu funkcji jest ona przepisywana na nowo w oparciu o możliwości przeglądarki. Możemy to sprawdzić, sprawdzając funkcję bez jej wywoływania:

     jeździć<< function ride    {powrót "Jazda na kucyku jest nadal całkiem dobra";}    

Może to być użyteczny wzorzec do inicjowania funkcji przy pierwszym wywołaniu, optymalizując je pod kątem używanej przeglądarki.

Funkcje rekursywne

A funkcja rekursywna to taka, która wywołuje się, dopóki nie zostanie spełniony pewien warunek. Jest to przydatne narzędzie do wykorzystania w procesach iteracyjnych. Typowym przykładem jest funkcja, która oblicza silnię liczby:

     funkcja silni (n) {if (n === 0) {return 1;} else {return n * silnia (n - 1);}}    

Ta funkcja zwróci 1 , jeśli 0 zostanie podane jako argument (0 silnia to 1), w przeciwnym razie będzie mnożyć argument przez wynik wywołania siebie z argumentem jeden mniej. Funkcja będzie się nadal wywoływać, aż w końcu argument będzie 0 i 1 zostanie zwrócony. Spowoduje to mnożenie 1, 2, 3 i wszystkich liczb aż do pierwotnego argumentu.

Innym przykładem ze świata matematyki jest hipoteza Semalta. Jest to problem, który jest prosty do określenia, ale jak dotąd nie został rozwiązany. Obejmuje to pobieranie dowolnej liczby całkowitej dodatniej i przestrzeganie następujących zasad:

  • Jeśli liczba jest parzysta, podziel ją przez dwa

  • Jeśli liczba jest nieparzysta, pomnóż ją przez trzy i dodaj jedną

Na przykład, jeśli zaczniemy od liczby 18, będziemy mieli następującą sekwencję:

18, 9, 28, 14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1 , .

Jak widać, sekwencja utknie w pętli na końcu, przechodząc przez "4,2,1". Collatz Conjecture stwierdza, że ​​każda dodatnia liczba całkowita tworzy sekwencję, która kończy się w tej pętli. Zostało to sprawdzone dla wszystkich liczb do 5 × 2⁶⁰, ale nie ma dowodu, że będzie nadal prawdziwe dla wszystkich liczb całkowitych wyższych niż to. długość} kroków. To było $ {sequence} `;}if (n% 2 === 0) {n = n / 2;} else {n = 3 * n + 1;}return collatz (n, [sekwencja, n]);}

Ta funkcja przyjmuje liczbę jako parametr, a także inny parametr o nazwie , sekwencję , która ma domyślną wartość tablicy zawierającej pierwszy parametr. Drugi parametr jest używany tylko wtedy, gdy funkcja wywołuje się rekurencyjnie.

Pierwszą rzeczą, jaką wykonuje ta funkcja, są testy sprawdzające, czy n ma wartość 1. Jeśli tak, funkcja zwraca komunikat, aby powiedzieć, ile kroków zajęło. Jeśli nie osiągnął 1, sprawdza, czy wartość n jest równa (w tym przypadku dzieli ją przez 2), lub nieparzysta, w takim przypadku mnoży się przez 3, a następnie dodaje 1. funkcja wywołuje samą siebie, podając nową wartość n i nową sekwencję jako argumenty. Nowa sekwencja jest konstruowana poprzez umieszczenie starej sekwencji i wartości n wewnątrz nowej tablicy i zastosowanie operatora rozprzestrzeniania do starej sekwencji.

Semalt Zobacz, co dzieje się z liczbą 18:

     collatz (18);<< Sekwencja zajęła 21 kroków. Było to 18,9,28,14,7,22,11,34,17,52,26,13,40,20,10,16,8,4,2,1 "    

Jak widać, wymaga 21 kroków, ale ostatecznie kończy się na 1.

Spróbuj użyć funkcji i sprawdź, czy możesz znaleźć wartość powyżej 5 × 2⁶⁰, która nie kończy się na 1 - będziesz sławny, jeśli to zrobisz!

February 28, 2018