Programmering

10 JavaScript-konsepter hver Node.js-utvikler må mestre

Rahul Mhatre er utviklerteamleder i Software AG.

Med JavaScript og V8-motoren i kjernen, en hendelsesdrevet arkitektur og skalerbarhet, er Node.js raskt blitt de facto-standarden for å lage webapplikasjoner og SaaS-produkter. Node.js-rammeverk som Express, Sails og Socket.IO lar brukere raskt starte opp applikasjoner og bare fokusere på forretningslogikken.

Node.js skylder JavaScript mye for sin enorme popularitet. JavaScript er et flerspråklig språk som støtter mange forskjellige programmeringsstiler, inkludert funksjonell programmering, prosessuell programmering og objektorientert programmering. Det gjør at utvikleren kan være fleksibel og dra nytte av de forskjellige programmeringsstiler.

Men JavaScript kan være et tveegget sverd. Multiparadigm-naturen til JavaScript betyr at nesten alt er foranderlig. Dermed kan du ikke fjerne sannsynligheten for objekt- og omfangsmutasjon når du skriver Node.js-kode. Fordi JavaScript mangler optimering av haleanrop (som gjør at rekursive funksjoner kan gjenbruke stabelrammer for rekursive samtaler), er det farlig å bruke rekursjon for store iterasjoner. I tillegg til fallgruver som disse, er Node.js med en tråd, så det er viktig for utviklere å skrive asynkron kode.

JavaScript kan være en velsignelse hvis den brukes med forsiktighet - eller en bane hvis du er hensynsløs. Å følge strukturerte regler, designmønstre, nøkkelkonsepter og grunnleggende tommelfingerregler vil hjelpe deg med å velge den optimale tilnærmingen til et problem. Hvilke nøkkelbegreper skal Node.js-programmerere forstå? Nedenfor vil jeg dele de 10 JavaScript-konseptene som jeg mener er viktigst for å skrive effektiv og skalerbar Node.js-kode.

Relatert video: Node.js tips og triks

I denne forklaringsvideoen kan du lære deg flere teknikker som kan forbedre din Node-utviklingsopplevelse.

JavaScript IIFEs: Umiddelbart påkalt funksjonsuttrykk

Et umiddelbart påkalt funksjonsuttrykk (IIFE) er en funksjon som utføres så snart den er opprettet. Den har ingen forbindelse med hendelser eller asynkron kjøring. Du kan definere en IIFE som vist nedenfor:

(funksjon () {

// all koden din her

// ...

})();

Det første parparenteset funksjon(){...} konverterer koden i parentes til et uttrykk. Det andre paret i parentes kaller funksjonen som er resultatet av uttrykket. En IIFE kan også beskrives som en selvinnkallende anonym funksjon. Den vanligste bruken er å begrense omfanget av en variabel laget via var eller for å kapsle sammenheng for å unngå navnekollisjoner.

JavaScript lukkes

En lukking i JavaScript er en indre funksjon som har tilgang til den ytre funksjonens omfang, selv etter at den ytre funksjonen har gitt tilbake kontrollen. En lukking gjør variablene til den indre funksjonen private. Et enkelt eksempel på en nedleggelse er vist nedenfor:

var count = (funksjon () {

var _counter = 0;

returfunksjon () {retur _teller + = 1;}

})();

telle();

telle();

telle();

> // telleren er nå 3

Variabelen telle er tildelt en ytre funksjon. Den ytre funksjonen kjører bare én gang, som setter telleren til null og returnerer en indre funksjon. De _disk variabel kan bare nås med den indre funksjonen, som får den til å oppføre seg som en privat variabel.

JavaScript-prototyper

Hver JavaScript-funksjon har en prototype-egenskap som brukes til å legge ved egenskaper og metoder. Denne eiendommen kan ikke telles. Det lar utvikleren knytte metoder eller medlemsfunksjoner til objektene sine. JavaScript støtter arv bare gjennom prototypegenskapen. I tilfelle et arvet objekt peker prototypegenskapen på objektets foreldre. En vanlig tilnærming for å knytte metoder til en funksjon er å bruke prototyper som vist nedenfor:

funksjon rektangel (x, y) {

denne._lengde = x;

denne._bredde = y;

}

Rectangle.prototype.getDimensions = funksjon () {

returner {lengde: dette._lengde, bredde: dette._bredde};

};

Rectangle.prototype.setDimensions = funksjon (len, avlet) {

this._length = len;

this._breadth = avlet;

};

JavaScript private eiendommer, ved hjelp av nedleggelser

JavaScript lar deg definere private eiendommer ved å bruke understrekingsprefikset som vist i eksemplet ovenfor. Dette hindrer imidlertid ikke en bruker i å få direkte tilgang til eller endre en eiendom som skal være privat.

Å definere private eiendommer ved hjelp av nedleggelser vil hjelpe deg med å løse dette problemet. Medlemsfunksjonene som trenger tilgang til private eiendommer, bør defineres på selve objektet. Du kan lage private eiendommer ved hjelp av nedleggelser som vist nedenfor:

funksjon rektangel (_length, _breadth) {

this.getDimensions = funksjon () {

returner {lengde: _lengde, bredde: _bredde};

     };

this.setDimension = funksjon (len, avlet) {

_lengde = len;

_bredde = avlet

    };

}

JavaScript-modulmønster

Modulmønsteret er det hyppigst brukte designmønsteret i JavaScript for å oppnå løst koblet, godt strukturert kode. Det lar deg lage offentlige og private tilgangsnivåer. En måte å oppnå et modulmønster på er vist nedenfor:

var Retning = (funksjon () {

var _direction = 'fremover'

var changeDirection = funksjon (d) {

_direction = d;

  }

returner {setDirection: funksjon (d) {

endre Retning (d);

console.log (_direction);

          }

  };

})();

Direction.setDirection ('bakover'); // Utganger: 'bakover'

console.log (Direction._direction);

Det avslørende modulmønsteret ligner på modulmønsteret der variablene og metodene som må eksponeres returneres i et objekt bokstavelig. Ovenstående eksempel kan skrives ved hjelp av avslørende modulmønster som følger:

var Retning = (funksjon () {

var _direction = 'fremover';

var _privateChangeDirection = funksjon (d) {

_direction = d;

  }

komme tilbake {

setDirection: _privateChangeDirection

  };

})();

Heising av JavaScript

JavaScript flytter variabler og funksjonserklæringer til toppen av omfanget før kodeutførelse. Dette kalles heising. Uansett hvor du plasserer erklæringen om funksjoner og variabler i koden din, blir de flyttet til toppen av omfanget av tolken. Dette kan eller ikke kan være der du vil ha dem. Hvis ikke, vil programmet ha feil.

Variable erklæringer behandles før noen kode blir utført. Ironisk nok eksisterer ikke deklarerte variabler før de tildeles en verdi. Dette fører til at alle sortvariabler blir globale variabler. Selv om funksjonserklæringer er heist, heises ikke funksjonsuttrykk. JavaScript har en prioritetsrekkefølge mens du heiser variabler og funksjoner.

Prioriteten er gitt nedenfor fra høyere til lavere:

  • Variabel oppgave
  • Funksjonserklæring
  • Variable erklæringer

For å unngå feil, bør du erklære variablene og funksjonene dine i begynnelsen av hvert omfang.

JavaScript currying

Currying er en metode for å gjøre funksjonene mer fleksible. Med en curried-funksjon kan du sende alle argumentene som funksjonen forventer og få resultatet, eller du kan bare sende en delmengde av argumenter og motta en funksjon tilbake som venter på resten av argumentene. Et enkelt eksempel på karri er gitt nedenfor:

var myFirstCurry = funksjon (ord) {

returfunksjon (bruker) {

return [word, ",", user] .join ("");

  };

};

var HelloUser = myFirstCurry ("Hei");

HelloUser ("Rahul"); // Output: "Hello, Rahul"

Den opprinnelige karri-funksjonen kan kalles direkte ved å sende hver av parameterne i et eget sett med parenteser etter hverandre som vist nedenfor:

myFirstCurry ("Hei, wassup!") ("Rahul"); // Output: "Hei, wassup !, Rahul"

JavaScript gjelder, ring og bind metoder

Det er viktig for enhver JavaScript-utvikler å forstå forskjellen mellom anrop, søke om, og binde metoder. De tre funksjonene er like ved at deres første argument alltid er "denne" verdien, eller konteksten, som du vil gi funksjonen du kaller metoden på.

Av de tre, anrop er det enkleste. Det er det samme som å påkalle en funksjon mens du spesifiserer konteksten. Her er et eksempel:

var bruker = {

navn: "Rahul Mhatre",

whatIsYourName: funksjon () {

console.log (dette.navn);

     }

};

user.whatIsYourName (); // Output: "Rahul Mhatre",

var bruker2 = {

navn: "Neha Sampat"

};

user.whatIsYourName.call (user2); // Utgang: "Neha Sampat"

Noter det søke om er nesten det samme som anrop. Den eneste forskjellen er at du sender argumenter som en matrise og ikke separat. Arrays er enklere å manipulere i JavaScript, og åpner et større antall muligheter for å jobbe med funksjoner. Her er et eksempel på bruk av søke om og anrop:

var bruker = {

hilsen: "Hei!",

greetUser: function (userName) {

console.log (this.greet + "" + brukernavn);

     }

};

var hilsen1 = {

hilsen: "Hola"

};

user.greetUser.call (greet1, "Rahul") // Utgang: "Hola Rahul"

user.greetUser.apply (greet1, ["Rahul"]) // Utgang: "Hola Rahul"

De binde metoden lar deg sende argumenter til en funksjon uten å påkalle den. En ny funksjon returneres med argumenter avgrenset før eventuelle ytterligere argumenter. Her er et eksempel:

var bruker = {

hilsen: "Hei!",

greetUser: function (userName) {

console.log (this.greet + "" + brukernavn);

}

};

var greetHola = user.greetUser.bind ({greet: "Hola"});

var greetBonjour = user.greetUser.bind ({greet: "Bonjour"});

greetHola ("Rahul") // Utgang: "Hola Rahul"

greetBonjour ("Rahul") // Utgang: "Bonjour Rahul"

JavaScript-memoisering

Memoization er en optimaliseringsteknikk som fremskynder funksjonsutførelsen ved å lagre resultater av dyre operasjoner og returnere de bufrede resultatene når det samme settet med innganger oppstår igjen. JavaScript-objekter oppfører seg som assosierende matriser, noe som gjør det enkelt å implementere memoization i JavaScript. For eksempel kan vi konvertere en rekursiv faktoriell funksjon til en husket faktoriell funksjon som vist nedenfor:

funksjon memoizeFunction (func) {

var cache = {};

returfunksjon () {

var key = argumenter [0];

hvis (hurtigbuffer [nøkkel]) {

retur cache [nøkkel];

          }

annet {

var val = func.apply (dette, argumenter);

cache [nøkkel] = val;

retur val;

          }

  };

}

var Fibonacci = memoizeFunction (funksjon (n)

retur (n === 0);

JavaScript-overbelastning

Metodeoverbelastning gjør at flere metoder kan ha samme navn, men forskjellige argumenter. Kompilatoren eller tolk bestemmer hvilken funksjon som skal ringes ut basert på antall argumenter som er sendt. Metodeoverbelastning støttes ikke direkte i JavaScript. Men du kan oppnå noe som ligner på det som vist nedenfor:

funksjon overloadMethod (objekt, navn, fn) {

hvis (! object._overload) {

object._overload = {};

     }

hvis (! object._overload [navn]) {

object._overload [navn] = {};

    }

hvis (! object._overload [name] [fn.length]) {

object._overload [navn] [fn.length] = fn;

    }

objekt [navn] = funksjon () {

hvis (this._overload [navn] [argumenter.lengde])

returner dette._overload [navn] [argumenter.lengde] .apply (dette, argumenter);

     };

funksjon Studenter () {

overloadMethod (dette, "finn", funksjon () {

// Finn en student ved navn

  });

overloadMethod (dette, "finn", funksjon (første, siste) {

// Finn en student på for- og etternavn

  });

}

var studenter = nye studenter ();

studenter. finn (); // Finner alt

students.find ("Rahul"); // Finner studenter etter navn

students.find ("Rahul", "Mhatre"); // Finner brukere etter for- og etternavn

Når du blir godt kjent med Node.js, vil du legge merke til at det er mange måter å løse nesten alle problemer. Men å ta riktig tilnærming er kritisk. En feil tilnærming vil resultere i flere bivirkninger som ujevn eller buggy applikasjoner eller regresjoner som tvinger deg til å omskrive hele logikken. På baksiden vil den rette tilnærmingen legge grunnlaget for en robust, effektiv og skalerbar applikasjon.

De 10 JavaScript-konseptene som er beskrevet i denne artikkelen, er grunnleggende alle Node.js-utviklere bør vite. Men de er toppen av isfjellet. JavaScript er kraftig og kompleks. Jo mer du bruker den, jo mer vil du forstå hvor stort JavaScript egentlig er. En bedre forståelse av et så omfattende språk vil absolutt hjelpe deg med å unngå feil. I mellomtiden kan du få det grunnleggende riktig, så får du gode resultater.

Rahul Mhatre er utviklerteamleder i Software AG. Tidligere var han teknisk arkitekt hos Built.io, som ble kjøpt opp av Software AG.

New Tech Forum er et sted for å utforske og diskutere ny teknologi i enestående dybde og bredde. Valget er subjektivt, basert på vårt valg av teknologiene vi mener er viktige og av størst interesse for leserne. godtar ikke markedsføringssikkerhet for publisering og forbeholder seg retten til å redigere alt bidratt innhold. Send alle henvendelser til [email protected].

$config[zx-auto] not found$config[zx-overlay] not found