모든 Node.js 개발자가 마스터해야하는 10 가지 JavaScript 개념

Rahul Mhatre는 Software AG의 개발자 팀 리더입니다.

JavaScript 및 V8 엔진을 핵심으로, 이벤트 기반 아키텍처 및 즉시 사용 가능한 확장 성을 갖춘 Node.js는 웹 애플리케이션 및 SaaS 제품을 만드는 데있어 사실상의 표준이되었습니다. Express, Sails 및 Socket.IO와 같은 Node.js 프레임 워크를 통해 사용자는 애플리케이션을 빠르게 부트 스트랩하고 비즈니스 로직에만 집중할 수 있습니다.

Node.js는 엄청난 인기를 얻은 JavaScript 덕분입니다. JavaScript는 함수형 프로그래밍, 절차 적 프로그래밍 및 객체 지향 프로그래밍을 포함하여 다양한 스타일의 프로그래밍을 지원하는 다중 패러다임 언어입니다. 이를 통해 개발자는 유연하고 다양한 프로그래밍 스타일을 활용할 수 있습니다.

그러나 JavaScript는 양날의 검이 될 수 있습니다. JavaScript의 다중 패러다임 특성은 거의 모든 것이 변경 가능함을 의미합니다. 따라서 Node.js 코드를 작성할 때 객체 및 범위 변형 가능성을 무시할 수 없습니다. JavaScript에는 꼬리 호출 최적화 (재귀 함수가 재귀 호출에 스택 프레임을 재사용 할 수 있도록 허용)가 없기 때문에 대규모 반복에 재귀를 사용하는 것은 위험합니다. 이와 같은 함정 외에도 Node.js는 단일 스레드이므로 개발자가 비동기 코드를 작성하는 것이 필수적입니다.

자바 스크립트는주의해서 사용하면 도움이 될 수 있고 무모한 경우에는 골칫거리가 될 수 있습니다. 구조화 된 규칙, 디자인 패턴, 주요 개념 및 기본 경험 규칙을 따르면 문제에 대한 최적의 접근 방식을 선택하는 데 도움이됩니다. Node.js 프로그래머는 어떤 핵심 개념을 이해해야합니까? 아래에서는 효율적이고 확장 가능한 Node.js 코드를 작성하는 데 가장 중요하다고 생각하는 10 가지 JavaScript 개념을 공유합니다.

관련 비디오 : Node.js 팁과 트릭

이 설명자 비디오에서는 노드 개발 경험을 향상시킬 수있는 몇 가지 기술을 배웁니다.

JavaScript IIFE : 즉시 호출되는 함수 표현식

즉시 호출 된 함수 식 (IIFE)은 생성되는 즉시 실행되는 함수입니다. 이벤트 또는 비동기 실행과 연결되지 않습니다. 아래와 같이 IIFE를 정의 할 수 있습니다.

(함수() {

// 여기에 모든 코드

// ...

}) ();

첫 번째 괄호 쌍은 괄호 안의 function(){...}코드를 표현식으로 변환하고 두 번째 괄호 쌍은 표현식의 결과 함수를 호출합니다. IIFE는 자체 호출 익명 함수로도 설명 할 수 있습니다. 가장 일반적인 사용법은 var이름 충돌을 피하기 위해을 통해 만들어지는 변수의 범위를 제한 하거나 컨텍스트를 캡슐화하는 것입니다.

JavaScript 클로저

JavaScript의 클로저는 외부 함수가 제어를 반환 한 후에도 외부 함수의 범위에 액세스 할 수있는 내부 함수입니다. 클로저는 내부 함수의 변수를 비공개로 만듭니다. 다음은 클로저의 간단한 예입니다.

var count = (function () {

    var _counter = 0;

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

}) ();

카운트();

카운트();

카운트();

> // 카운터는 이제 3입니다.

변수 count에는 외부 기능이 할당됩니다. 외부 함수는 카운터를 0으로 설정하고 내부 함수를 반환하는 한 번만 실행됩니다. _counter변수는 전용 변수처럼 행동을하게하는 내부 기능에 의해 액세스 될 수있다.

JavaScript 프로토 타입

모든 JavaScript 함수에는 속성과 메서드를 연결하는 데 사용되는 프로토 타입 속성이 있습니다. 이 속성은 열거 할 수 없습니다. 개발자가 메서드 또는 멤버 함수를 개체에 연결할 수 있습니다. JavaScript는 prototype 속성을 통해서만 상속을 지원합니다. 상속 된 객체의 경우 프로토 타입 속성은 객체의 부모를 가리 킵니다. 함수에 메서드를 연결하는 일반적인 방법은 아래와 같이 프로토 타입을 사용하는 것입니다.

function Rectangle (x, y) {

    this._length = x;

    this._breadth = y;

}

Rectangle.prototype.getDimensions = function () {

    return {길이 : this._length, 너비 : this._breadth};

};

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

    this._length = len;

    this._breadth = 자란;

};

클로저를 사용하는 JavaScript 개인 속성

JavaScript를 사용하면 위의 예와 같이 밑줄 접두사를 사용하여 개인 속성을 정의 할 수 있습니다. 그러나 이것은 사용자가 개인용으로 간주되는 속성에 직접 액세스하거나 수정하는 것을 방지하지 않습니다.

클로저를 사용하여 개인 속성을 정의하면이 문제를 해결하는 데 도움이됩니다. 개인 속성에 액세스해야하는 멤버 함수는 개체 자체에서 정의해야합니다. 아래와 같이 클로저를 사용하여 개인 속성을 만들 수 있습니다.

function Rectangle (_length, _breadth) {

     this.getDimensions = function () {

     return {길이 : _length, 너비 : _breadth};

     };

     this.setDimension = function (len, bred) {

     _length = len;

    _ 폭 = 자란

    };

}

JavaScript 모듈 패턴

모듈 패턴은 느슨하게 결합되고 잘 구조화 된 코드를 얻기 위해 JavaScript에서 가장 자주 사용되는 디자인 패턴입니다. 공개 및 비공개 액세스 수준을 만들 수 있습니다. 모듈 패턴을 달성하는 한 가지 방법은 다음과 같습니다.

var 방향 = (function () {

  var _direction = '앞으로'

  var changeDirection = function (d) {

          _ 방향 = d;

  }

  return {setDirection : function (d) {

          changeDirection (d);

          console.log (_direction);

          }

  };

}) ();

Direction.setDirection ( 'backward'); // 출력 : 'backward'

console.log (Direction._direction);

Revealing Module 패턴은 노출되어야하는 변수와 메소드가 객체 리터럴로 반환되는 Module 패턴과 유사합니다. 위의 예는 다음과 같이 Revealing Module 패턴을 사용하여 작성할 수 있습니다.

var 방향 = (function () {

  var _direction = '앞으로';

  var _privateChangeDirection = function (d) {

_ 방향 = d;

  }

  return {

          setDirection : _privateChangeDirection

  };

}) ();

자바 스크립트 게양

JavaScript는 코드 실행 전에 변수와 함수 선언을 해당 범위의 맨 위로 이동합니다. 이것을 호이 스팅이라고합니다. 코드에서 함수 및 변수 선언 위치에 관계없이 인터프리터가 해당 범위의 맨 위로 이동합니다. 이것은 당신이 원하는 곳일 수도 있고 아닐 수도 있습니다. 그렇지 않으면 프로그램에 오류가 있습니다.

코드가 실행되기 전에 변수 선언이 처리됩니다. 아이러니하게도 선언되지 않은 변수는 값이 할당 될 때까지 존재하지 않습니다. 이렇게하면 선언되지 않은 모든 변수가 전역 변수가됩니다. 함수 선언은 호이스트되지만 함수 표현식은 호이스트되지 않습니다. JavaScript는 변수와 함수를 끌어 올리는 동안 우선 순위가 있습니다.

우선 순위는 높은 것에서 낮은 것까지 아래에 주어집니다.

  • 변수 할당
  • 함수 선언
  • 변수 선언

버그를 방지하려면 모든 범위의 시작 부분에서 변수와 함수를 선언해야합니다. 

자바 스크립트 커링

커링은 기능을보다 유연하게 만드는 방법입니다. 커리 함수를 사용하면 함수가 예상하는 모든 인수를 전달하고 결과를 얻을 수 있습니다. 또는 인수의 하위 집합 만 전달하고 나머지 인수를 기다리는 함수를 다시받을 수 있습니다. 다음은 카레의 간단한 예입니다.

var myFirstCurry = function (word) {

  return function (user) {

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

  };

};

var HelloUser = myFirstCurry ( "Hello");

HelloUser ( "라훌"); // 출력 : "Hello, Rahul"

원래 curried 함수는 아래와 같이 별도의 괄호 세트에 각 매개 변수를 차례로 전달하여 직접 호출 할 수 있습니다.

myFirstCurry ( "이봐, 안녕!") ( "라훌"); // 출력 : "Hey, wassup !, Rahul"

JavaScript 적용, 호출 및 바인딩 메서드

자바 스크립트 개발자 사이의 차이를 이해하는 것이 필수적이다 call, apply그리고 bind방법을. 세 함수는 첫 번째 인수가 항상 메서드를 호출하는 함수에 제공하려는 "this"값 또는 컨텍스트라는 점에서 유사합니다.

세 가지 중 call가장 쉽습니다. 컨텍스트를 지정하는 동안 함수를 호출하는 것과 같습니다. 예를 들면 다음과 같습니다.

var user = {

     이름 : "Rahul Mhatre",

     whatIsYourName : function () {

     console.log (this.name);

     }

};

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

var user2 = {

     이름 : "Neha Sampat"

};

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

apply와 거의 동일합니다 call. 유일한 차이점은 인수를 개별적으로 전달하지 않고 배열로 전달한다는 것입니다. 배열은 JavaScript에서 더 쉽게 조작 할 수 있으므로 함수 작업을위한 많은 가능성이 열립니다. 다음은 apply및 사용하는 예입니다 call.

var user = {

     인사 : "Hello!",

     greetUser : function (userName) {

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

     }

};

var greet1 = {

     greet: "Hola"

};

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

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

bind메서드를 사용하면 함수를 호출하지 않고도 함수에 인수를 전달할 수 있습니다. 추가 인수 앞에 바인딩 된 인수와 함께 새 함수가 반환됩니다. 다음은 그 예입니다.

var user = {

     인사 : "Hello!",

     greetUser : function (userName) {

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

}

};

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

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

greetHola ( "Rahul") // 출력 : "Hola Rahul"

greetBonjour ( "Rahul") // 출력 : "Bonjour Rahul"

자바 스크립트 메모

Memoization은 값 비싼 작업의 결과를 저장하고 동일한 입력 집합이 다시 발생하면 캐시 된 결과를 반환하여 함수 실행 속도를 높이는 최적화 기술입니다. JavaScript 객체는 연관 배열처럼 작동하므로 JavaScript에서 메모를 쉽게 구현할 수 있습니다. 예를 들어, 다음과 같이 재귀 계승 함수를 메모 된 계승 함수로 변환 할 수 있습니다.

function memoizeFunction (func) {

  var cache = {};

  return function () {

          var key = arguments [0];

          if (캐시 [키]) {

          return cache [key];

          }

          else {

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

          캐시 [키] = 발;

          반환 발;

          }

  };

}

var fibonacci = memoizeFunction (function (n)

  반환 (n === 0);

JavaScript 메서드 오버로딩

메서드 오버로딩을 사용하면 여러 메서드가 이름은 같지만 인수는 다를 수 있습니다. 컴파일러 또는 인터프리터는 전달 된 인수 수에 따라 호출 할 함수를 결정합니다. 메서드 오버로딩은 JavaScript에서 직접 지원되지 않습니다. 그러나 아래와 같이 매우 유사한 것을 얻을 수 있습니다.

function overloadMethod (object, name, fn) {

     if (! object._overload) {

    object._overload = {};

     }

     if (! object._overload [이름]) {

    object._overload [이름] = {};

    }

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

object._overload [이름] [fn.length] = fn;

    }

     객체 [이름] = function () {

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

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

     };

function Students () {

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

          // 이름으로 학생 찾기

  });

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

          // 성과 이름으로 학생 찾기

  });

}

var students = new Students ();

students.find (); // 모두 검색

students.find ( "라훌"); // 이름으로 학생 찾기

students.find ( "Rahul", "Mhatre"); // 성과 이름으로 사용자를 찾습니다.

Node.js에 익숙해지면 거의 모든 문제를 해결할 수있는 많은 방법이 있음을 알게 될 것입니다. 그러나 올바른 접근 방식을 취하는 것이 중요합니다. 잘못된 접근 방식은 전체 논리를 다시 작성해야하는 고르지 않거나 버그가있는 응용 프로그램 또는 회귀와 같은 여러 가지 부작용을 초래합니다. 반대로 올바른 접근 방식은 강력하고 효율적이며 확장 가능한 애플리케이션의 기반을 마련 할 것입니다.

이 기사에서 설명하는 10 가지 JavaScript 개념은 모든 Node.js 개발자가 알아야 할 기본 사항입니다. 그러나 그들은 빙산의 일각입니다. JavaScript는 강력하고 복잡합니다. 더 많이 사용할수록 JavaScript가 실제로 얼마나 방대한 지 더 많이 이해할 수 있습니다. 그러한 광범위한 언어를 더 잘 이해하면 실수를 피할 수 있습니다. 그동안 기본 사항을 올바르게 설정하면 훌륭한 결과를 얻을 수 있습니다.

Rahul Mhatre는 Software AG의 개발자 팀 리더입니다. 이전에는 Software AG가 인수 한 Built.io의 기술 설계자였습니다. 

New Tech Forum은 새로운 엔터프라이즈 기술을 전례없이 깊이 있고 폭넓게 탐구하고 논의 할 수있는 장을 제공합니다. 선택은 우리가 중요하고 독자들에게 가장 큰 관심을 가지고 있다고 생각하는 기술을 선택하여 주관적입니다. 는 게시를위한 마케팅 자료를 허용하지 않으며 제공되는 모든 콘텐츠를 편집 할 권리를 보유합니다. 모든 문의 사항은 [email protected]으로 보내주십시오.