10 pojęć JavaScript, które każdy programista Node.js musi opanować

Rahul Mhatre jest kierownikiem zespołu programistów w Software AG.

Z JavaScript i silnikiem V8 w rdzeniu, architekturą sterowaną zdarzeniami i skalowalnością po wyjęciu z pudełka, Node.js szybko stał się de facto standardem do tworzenia aplikacji internetowych i produktów SaaS. Struktury Node.js, takie jak Express, Sails i Socket.IO, umożliwiają użytkownikom szybkie ładowanie aplikacji i skupienie się wyłącznie na logice biznesowej.

Node.js wiele zawdzięcza JavaScriptowi ze względu na swoją ogromną popularność. JavaScript jest językiem wieloparadygmatowym, który obsługuje wiele różnych stylów programowania, w tym programowanie funkcjonalne, programowanie proceduralne i programowanie obiektowe. Pozwala programistom na elastyczność i wykorzystanie różnych stylów programowania.

Ale JavaScript może być mieczem obosiecznym. Wieloparadygmatyczny charakter JavaScript oznacza, że ​​prawie wszystko jest zmienne. Dlatego podczas pisania kodu Node.js. nie można pominąć prawdopodobieństwa mutacji obiektu i zakresu. Ponieważ JavaScript nie posiada optymalizacji wywołań ogonowych (co pozwala funkcjom rekurencyjnym na ponowne wykorzystanie ramek stosu do wywołań rekurencyjnych), używanie rekurencji w dużych iteracjach jest niebezpieczne. Oprócz takich pułapek, Node.js jest jednowątkowy, więc programiści muszą pisać kod asynchroniczny.

JavaScript może być dobrodziejstwem, jeśli jest używany z ostrożnością - lub zmorą, jeśli jesteś lekkomyślny. Przestrzeganie ustrukturyzowanych zasad, wzorców projektowych, kluczowych pojęć i podstawowych praktycznych zasad pomoże Ci wybrać optymalne podejście do problemu. Jakie kluczowe pojęcia powinni zrozumieć programiści Node.js? Poniżej przedstawię 10 pojęć JavaScript, które moim zdaniem są najważniejsze przy pisaniu wydajnego i skalowalnego kodu Node.js.

Powiązane wideo: porady i wskazówki dotyczące Node.js.

W tym filmie wyjaśniającym poznaj kilka technik, które mogą poprawić wrażenia z programowania Node.

JavaScript IIFE: natychmiast wywoływane wyrażenia funkcyjne

Wyrażenie funkcyjne wywoływane natychmiast (IIFE) to funkcja, która jest wykonywana zaraz po utworzeniu. Nie ma połączenia z żadnymi zdarzeniami ani wykonywaniem asynchronicznym. Możesz zdefiniować IIFE, jak pokazano poniżej:

(funkcja () {

// cały kod tutaj

// ...

}) ();

Pierwsza para nawiasów function(){...}konwertuje kod zawarty w nawiasach na wyrażenie, a druga para nawiasów wywołuje funkcję wynikającą z wyrażenia. IIFE można również opisać jako samo-wywołującą się funkcję anonimową. Jego najczęstszym użyciem jest ograniczenie zakresu zmiennej utworzonej za pośrednictwem varlub hermetyzacja kontekstu w celu uniknięcia kolizji nazw.

Zamknięcia JavaScript

Zamknięcie w JavaScript jest funkcją wewnętrzną, która ma dostęp do zakresu swojej funkcji zewnętrznej, nawet po zwróceniu kontroli przez funkcję zewnętrzną. Zamknięcie sprawia, że ​​zmienne funkcji wewnętrznej stają się prywatne. Prosty przykład zamknięcia pokazano poniżej:

var count = (function () {

    var _counter = 0;

    return function () {return _counter + = 1;}

}) ();

liczyć();

liczyć();

liczyć();

> // licznik to teraz 3

Zmiennej countjest przypisana funkcja zewnętrzna. Funkcja zewnętrzna działa tylko raz, co ustawia licznik na zero i zwraca funkcję wewnętrzną. _counterZmienna może być dostępna tylko przez wewnętrzną funkcję, która sprawia, że zachowuje się jak zmiennej prywatnej.

Prototypy JavaScript

Każda funkcja JavaScript ma własność prototypu, która służy do dołączania właściwości i metod. Ta właściwość nie jest wyliczalna. Umożliwia deweloperowi dołączanie metod lub funkcji składowych do swoich obiektów. JavaScript obsługuje dziedziczenie tylko poprzez właściwość prototypu. W przypadku obiektu dziedziczonego własność prototypu wskazuje na rodzica obiektu. Typowym podejściem do dołączania metod do funkcji jest użycie prototypów, jak pokazano poniżej:

function Rectangle (x, y) {

    this._length = x;

    this._breadth = y;

}

Rectangle.prototype.getDimensions = function () {

    return {length: this._length, width: this._breadth};

};

Rectangle.prototype.setDimensions = function (len, bred) {

    this._length = len;

    this._breadth = hodowane;

};

Prywatne własności JavaScript, używające domknięć

JavaScript umożliwia definiowanie prywatnych właściwości za pomocą przedrostka podkreślenia, jak pokazano w powyższym przykładzie. Nie uniemożliwia to jednak użytkownikowi bezpośredniego uzyskiwania dostępu do właściwości, które mają być prywatne, ani ich modyfikowania.

Definiowanie prywatnych nieruchomości za pomocą zamknięć pomoże ci rozwiązać ten problem. Funkcje członkowskie, które wymagają dostępu do właściwości prywatnych, powinny być zdefiniowane w samym obiekcie. Możesz tworzyć prywatne nieruchomości za pomocą zamknięć, jak pokazano poniżej:

function Rectangle (_length, _breadth) {

     this.getDimensions = function () {

     return {length: _length, width: _breadth};

     };

     this.setDimension = function (len, bred) {

     _length = len;

    _breadth = hodowane

    };

}

Wzorzec modułu JavaScript

Wzorzec modułu jest najczęściej używanym wzorcem projektowym w JavaScript do tworzenia luźno powiązanego, dobrze zorganizowanego kodu. Umożliwia tworzenie poziomów dostępu publicznego i prywatnego. Poniżej przedstawiono jeden ze sposobów uzyskania wzoru modułu:

var Direction = (function () {

  var _direction = 'forward'

  var changeDirection = function (d) {

          _direction = d;

  }

  return {setDirection: function (d) {

          changeDirection (d);

          console.log (_direction);

          }

  };

}) ();

Direction.setDirection ('backward'); // Wyniki: 'backward'

console.log (Direction._direction);

Wzorzec Revealing Module jest podobny do wzorca Module, w którym zmienne i metody, które muszą zostać ujawnione, są zwracane w literale obiektu. Powyższy przykład można zapisać za pomocą wzorca Revealing Module w następujący sposób:

var Direction = (function () {

  var _direction = 'forward';

  var _privateChangeDirection = function (d) {

_direction = d;

  }

  powrót {

          setDirection: _privateChangeDirection

  };

}) ();

Podnoszenie JavaScript

JavaScript przenosi zmienne i deklaracje funkcji na początek ich zakresu przed wykonaniem kodu. Nazywa się to podnoszeniem. Niezależnie od tego, gdzie umieścisz deklarację funkcji i zmiennych w kodzie, interpreter przenosi je na początek swojego zakresu. To może, ale nie musi, być tam, gdzie chcesz. Jeśli nie, to Twój program będzie zawierał błędy.

Deklaracje zmiennych są przetwarzane przed wykonaniem jakiegokolwiek kodu. Jak na ironię, niezadeklarowane zmienne nie istnieją, dopóki nie zostaną przypisane im wartości. Powoduje to, że wszystkie niezadeklarowane zmienne stają się zmiennymi globalnymi. Chociaż deklaracje funkcji są podnoszone, wyrażenia funkcyjne nie są podnoszone. JavaScript ma priorytet podczas podnoszenia zmiennych i funkcji.

Priorytet jest podany poniżej od wyższego do niższego:

  • Przypisanie zmiennej
  • Deklaracja funkcji
  • Deklaracje zmiennych

Aby uniknąć błędów, powinieneś zadeklarować swoje zmienne i funkcje na początku każdego zakresu. 

Currying JavaScript

Currying to metoda uelastyczniania funkcji. Dzięki funkcji curried możesz przekazać wszystkie argumenty, których oczekuje funkcja i uzyskać wynik, lub możesz przekazać tylko podzbiór argumentów i otrzymać z powrotem funkcję, która czeka na pozostałe argumenty. Poniżej podano prosty przykład curry:

var myFirstCurry = function (word) {

  return function (user) {

            return [słowo, ",", użytkownik] .join ("");

  };

};

var HelloUser = myFirstCurry ("Hello");

HelloUser („Rahul”); // Wynik: „Witaj, Rahul”

Oryginalną funkcję curried można wywołać bezpośrednio, przekazując każdy z parametrów w oddzielnym zestawie nawiasów jeden po drugim, jak pokazano poniżej:

myFirstCurry („Hej, co tam!”) („Rahul”); // Wynik: „Hej, co tam !, Rahul”

JavaScript stosuje, wywołuje i wiąże metody

Jest to konieczne dla każdy programista JavaScript, aby zrozumieć różnicę między call, applyi bindmetod. Te trzy funkcje są podobne pod tym względem, że ich pierwszym argumentem jest zawsze wartość „this” lub kontekst, który chcesz nadać funkcji, do której wywołujesz metodę.

Z trzech calljest najłatwiejszy. To to samo, co wywołanie funkcji podczas określania jej kontekstu. Oto przykład:

var user = {

     nazwa: "Rahul Mhatre",

     whatIsYourName: function () {

     console.log (this.name);

     }

};

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

var user2 = {

     nazwa: „Neha Sampat”

};

user.whatIsYourName.call (użytkownik2); // Wynik: „Neha Sampat”

Zauważ, że applyto prawie to samo, co call. Jedyna różnica polega na tym, że argumenty przekazuje się jako tablicę, a nie oddzielnie. Tablice są łatwiejsze do manipulowania w JavaScript, otwierając większą liczbę możliwości pracy z funkcjami. Oto przykład użycia applyi call:

var user = {

     pozdrawiam: "Hello!",

     greetUser: function (nazwa_użytkownika) {

     console.log (this.greet + "" + nazwa_użytkownika);

     }

};

var greet1 = {

     greet: "Hola"

};

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

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

bindMetoda pozwala przekazywać argumenty do funkcji bez wywoływania go. Nowa funkcja jest zwracana z ograniczonymi argumentami poprzedzającymi wszelkie dalsze argumenty. Oto przykład:

var user = {

     pozdrawiam: "Hello!",

     greetUser: function (nazwa_użytkownika) {

     console.log (this.greet + "" + nazwa_użytkownika);

}

};

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

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

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

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

Zapamiętywanie JavaScript

Zapamiętywanie to technika optymalizacji, która przyspiesza wykonywanie funkcji poprzez przechowywanie wyników kosztownych operacji i zwracanie wyników z pamięci podręcznej, gdy ten sam zestaw danych wejściowych wystąpi ponownie. Obiekty JavaScript zachowują się jak tablice asocjacyjne, ułatwiając implementację zapamiętywania w JavaScript. Na przykład, możemy przekształcić rekurencyjną funkcję silni na zapamiętaną funkcję silni, jak pokazano poniżej:

function memoizeFunction (func) {

  var cache = {};

  return function () {

          var klucz = argumenty [0];

          if (cache [klucz]) {

          return cache [klucz];

          }

          else {

          var val = func.apply (this, arguments);

          cache [klucz] = val;

          return val;

          }

  };

}

var fibonacci = memoizeFunction (funkcja (n)

  return (n === 0);

Przeciążanie metod JavaScript

Przeciążanie metod pozwala wielu metodom mieć tę samą nazwę, ale różne argumenty. Kompilator lub interpreter określa, którą funkcję wywołać na podstawie liczby przekazanych argumentów. Przeciążanie metod nie jest bezpośrednio obsługiwane w języku JavaScript. Ale możesz osiągnąć coś bardzo podobnego, jak pokazano poniżej:

function overloadMethod (object, name, fn) {

     if (! object._overload) {

    object._overload = {};

     }

     if (! object._overload [nazwa]) {

    object._overload [nazwa] = {};

    }

     if (! object._overload [nazwa] [fn.length]) {

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

    }

     object [name] = function () {

         if (this._overload [nazwa] [arguments.length])

         return this._overload [nazwa] [arguments.length] .apply (this, argumenty);

     };

function Students () {

  overloadMethod (this, "find", function () {

          // Znajdź ucznia według nazwiska

  });

overloadMethod (this, "find", function (first, last) {

          // Znajdź ucznia według imienia i nazwiska

  });

}

var studentów = nowi studenci ();

Students.find (); // Znajduje wszystko

Students.find ("Rahul"); // Znajduje uczniów według imion

studentów.find ("Rahul", "Mhatre"); // Wyszukuje użytkowników według imienia i nazwiska

Gdy dobrze zaznajomisz się z Node.js, zauważysz, że istnieje wiele sposobów rozwiązania prawie każdego problemu. Ale przyjęcie właściwego podejścia jest krytyczne. Złe podejście spowoduje wiele skutków ubocznych, takich jak niejednolite lub błędne aplikacje lub regresje, które zmuszają Cię do przepisania całej logiki. Z drugiej strony właściwe podejście położy podwaliny pod solidną, wydajną i skalowalną aplikację.

10 pojęć JavaScript opisanych w tym artykule to podstawy, które powinien znać każdy programista Node.js. Ale to wierzchołek góry lodowej. JavaScript jest potężny i złożony. Im częściej go używasz, tym lepiej zrozumiesz, jak obszerny jest JavaScript. Lepsze zrozumienie tak rozbudowanego języka z pewnością pomoże Ci uniknąć błędów. W międzyczasie dobrze opanuj podstawy, a zobaczysz świetne rezultaty.

Rahul Mhatre jest kierownikiem zespołu programistów w Software AG. Wcześniej był architektem technicznym w firmie Built.io, przejętej przez Software AG. 

-

New Tech Forum to miejsce, w którym można badać i omawiać pojawiające się technologie dla przedsiębiorstw na niespotykaną dotąd skalę i dogłębnie. Wybór jest subiektywny, oparty na naszym wyborze technologii, które uważamy za ważne i najbardziej interesujące dla czytelników. nie przyjmuje marketingowych materiałów reklamowych do publikacji i zastrzega sobie prawo do edycji wszystkich przesłanych treści. Wszelkie zapytania należy kierować na adres [email protected]