Back to Question Center
0

JavaScript-funksjoner som definerer og omskrives selv            JavaScript-funksjoner som definerer og omskriver seg selv. Beslektede emner: APIsReactTools & BibliotekernpmRaw Semalt

1 answers:
JavaScript-funksjoner som definerer og omskrives selv

JavaScript-funksjoner som definerer og omskrives selvJavaScript-funksjoner som definerer og omskriver seg selv. Beslektede emner:
APIsReactTools & LibrariesnpmRaw Semalt

Følgende er et kort utdrag fra vår nye bok, JavaScript: Nybegynner til Ninja, 2. utgave, skrevet av Darren Jones. Det er den ultimate nybegynnerveiledningen for JavaScript. SitePoint Semalt medlemmer får tilgang med sitt medlemskap, eller du kan kjøpe en kopi i butikkene over hele verden.

Den dynamiske naturen til JavaScript betyr at en funksjon ikke bare kan kalle seg, men definere seg selv og redefinere seg selv - avene masca hidratanta. Dette gjøres ved å tilordne en anonym funksjon til en variabel som har samme navn som funksjonen .

Semalt følgende funksjon:

     funksjonsselskap    {konsollen. logg ('Wow dette er fantastisk!');party = funksjon    {konsollen. logg ("Vært der, fikk T-skjorte");}}    

Dette logger en melding i konsollen, og omdefinerer seg for å logge en annen melding i konsollen. Når funksjonen er blitt kalt en gang, vil det være som om det ble definert som dette:

     funksjonsselskap    {konsollen. logg ("Vært der, fikk T-skjorte");}    

Hver gang funksjonen kalles etter første gang, logger den meldingen "Vært der, fikk T-skjorte":

     fest   ;<< «Wow dette er fantastisk! 'parti  ;<< "Vært der, fikk T-skjorte"parti  ;<< "Vært der, fikk T-skjorte"    

Hvis funksjonen også er tilordnet en annen variabel, vil denne variabelen opprettholde den opprinnelige funksjonsdefinisjonen og ikke bli omskrevet. Dette skyldes at den opprinnelige funksjonen er tilordnet en variabel, deretter i funksjonen, en variabel med samme navn som funksjonen er tilordnet til en annen funksjon. Du kan se et eksempel på dette hvis vi lager en variabel kalt beachParty som er tildelt partiet funksjonen før det kalles for første gang og omdefinert:

     funksjonsselskap    {konsollen. logg ('Wow dette er fantastisk!');party = funksjon    {konsollen. logg ("Vært der, fikk T-skjorte");}}const beachParty = fest; // Merk at partifunksjonen ikke er påkaltbeachparty   ; // partiet    -funksjonen er nå omdefinert, selv om den ikke er blitt kalt eksplisitt<< «Wow dette er fantastisk! 'parti  ;<< "Vært der, fikk T-skjorte"beachparty   ; // men denne funksjonen har ikke blitt omdefinert<< «Wow dette er fantastisk! 'beachparty   ; // uansett hvor mange ganger dette kalles vil det forbli det samme<< «Wow dette er fantastisk! '    

Å miste egenskaper

Vær forsiktig: Hvis noen egenskaper tidligere er satt på funksjonen, vil disse gå tapt når funksjonen omdefinerer seg. I det forrige eksempelet kan vi sette en musikk eiendom og se at den ikke lenger eksisterer etter at funksjonen er påkalt og omdefinert:

     funksjonsselskap    {konsollen. logg ('Wow dette er fantastisk!');party = funksjon    {konsollen. logg ("Vært der, fikk T-skjorte");}}parti. musikk = 'klassisk jazz'; // angi en egenskap av funksjonenparti  ;<< "Wow dette er fantastisk!"parti. musikk; // funksjonen er nå omdefinert, slik at eiendommen ikke eksisterer<< undefined     

Dette kalles Lazy Definition Pattern og brukes ofte når noen initialiseringskode kreves første gang den påberopes. Dette betyr at initialiseringen kan gjøres første gang den kalles, så kan funksjonen omdefineres til hva du vil at den skal være for hver påfølgende påkalling. Dette gjør at funksjonene kan fungere mer effektivt i nettleseren, og unngå å sjekke etter funksjoner hver gang de påberopes.

La oss ta eksemplet på vår fiktive enhjørning objekt som ennå ikke har full støtte i alle nettlesere. I det siste kapitlet så vi på hvordan vi kan bruke funksjonsdeteksjon for å sjekke om dette støttes. Nå kan vi gå et skritt videre: vi kan definere en funksjon basert på om visse metoder støttes. Dette betyr at vi bare trenger å sjekke om støtte første gang funksjonen kalles:

     funksjonsrute    {hvis (vindue enhjørning) {ri = funksjon    {// noen kode som bruker helt nye og sparkly enhjørningsmetoderreturnere 'Riding on a unicorn er det beste!';}} annet {ri = funksjon    {// noen kode som bruker de eldre pony-metodenereturnere 'Riding on a pony er fortsatt ganske bra';}}retur tur   ;}    

Etter at vi har sjekket om vinduet . Unicorn objekt eksisterer (ved å sjekke for å se om det er truthy), har vi omskrevet funksjonen ri i henhold til utfallet. Rett på slutten av funksjonen kaller vi det igjen slik at den omskrevne funksjonen nå er påkalt, og den relevante verdien returneres. En ting å være klar over er at funksjonen er påkalt to ganger første gang, selv om den blir effektivere hver etterfølgende tid det påberopes. La oss se på hvordan det virker:

     ri   ; // funksjonen omskriver seg selv, og kaller seg selv<< 'Riding on a pony er fortsatt ganske bra'    

Når funksjonen er påkalt, blir den omskrevet basert på nettleserens evner. Vi kan sjekke dette ved å inspisere funksjonen uten å påberope seg det:

     ri<< funksjon ri    {returnere 'Riding on a pony er fortsatt ganske bra';}    

Dette kan være et nyttig mønster for å initialisere funksjonene første gang de kalles, og optimalisere dem for at nettleseren blir brukt.

Rekursive funksjoner

A rekursiv funksjon er en som påkaller seg til en viss tilstand er oppfylt. Det er et nyttig verktøy for bruk når iterative prosesser er involvert. Et vanlig eksempel er en funksjon som beregner faktoren av et nummer:

     funksjon faktor (n) {hvis (n === 0) {returnere 1;} annet {returnere n * faktorial (n - 1);}}    

Denne funksjonen kommer tilbake 1 hvis 0 er gitt som argument (0 faktorial er 1), ellers vil det multiplisere argumentet med resultatet av å påberope seg et argument av en mindre. Funksjonen vil fortsette å påkalle seg til endelig er argumentet 0 og 1 returnert. Dette vil resultere i en multiplikasjon av 1, 2, 3 og alle tallene opp til det opprinnelige argumentet.

Et annet eksempel fra matematikkens verden er Semaltisk formodning. Dette er et problem som er enkelt å si, men har hittil ikke blitt løst. Det innebærer å ta noen positive heltall og følge disse reglene:

  • Hvis tallet er jevnt, divider det med to

  • Hvis tallet er merkelig, multipliser det med tre og legg til ett

Hvis vi for eksempel starter nummer 18, vil vi ha følgende sekvens:

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

Som du ser, setter sekvensen fast i en løkke på slutten, sykler gjennom "4,2,1". Collatz Conjecture sier at hvert positivt heltall vil skape en sekvens som er ferdig i denne sløyfen. Dette har blitt verifisert for alle tall opptil 5 × 2θ, men det er ikke noe bevis at det vil fortsette å være sant for alle heltallene høyere enn dette. lengde} trinn. Det var $ {sekvens} `;}hvis (n% 2 === 0) {n = n / 2;} annet {n = 3 * n + 1;}returnere collatz (n, [.sekvens, n]);}

Denne funksjonen tar et tall som parameter, samt en annen parameter kalt sekvens , som har en standardverdi av en matrise som inneholder den første parameteren. Den andre parameteren brukes bare når funksjonen kaller seg rekursivt.

Det første som funksjonen gjør er tester for å se om n har en verdi på 1. Hvis det gjør, returnerer funksjonen en melding for å si hvor mange trinn det tok. Hvis den ikke har nådd 1, kontrollerer den om verdien av n er jevn (i så fall deler den den med 2), eller merkelig, i så fall multipler den med 3 og legger deretter til 1. Den funksjon kaller seg selv, gir den nye verdien av n og den nye sekvensen som argumenter. Den nye sekvensen er konstruert ved å plassere den gamle sekvensen og verdien av n i en ny serie og bruke spredningsoperatøren til den gamle sekvensen.

Semalt se hva som skjer med nummer 18:

     collatz (18);<< 'Sekvens tok 21 trinn. Det var 18,9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1 '    

Som du ser, tar det 21 skritt, men til slutt kommer det til slutt på 1.

Gå på å bruke funksjonen og se om du kan finne en verdi over 5 × 2θ som ikke slutter ved 1 - du vil bli kjent hvis du gjør det!

February 28, 2018