«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Концепции JavaScript, которыми должен овладеть каждый разработчик Node

Концепции JavaScript, которыми должен овладеть каждый разработчик Node

Опубликовано 2 ноября 2024 г.
Просматривать:860

Node.js быстро стал стандартом для создания веб-приложений и системного программного обеспечения благодаря способности использовать JavaScript на серверной стороне. Популярные фреймворки, такие как Express и такие инструменты, как Webpack, способствуют его широкому использованию. Хотя существуют такие конкуренты, как Deno и Bun, Node остается ведущей платформой серверного JavaScript.

Мультипарадигмальность JavaScript позволяет использовать различные стили программирования, но также создает такие риски, как мутация области видимости и объекта. Отсутствие оптимизации хвостовых вызовов делает большие рекурсивные итерации опасными, а однопоточная архитектура Node требует асинхронного кода для повышения эффективности. Несмотря на трудности, следование ключевым концепциям и лучшим практикам JavaScript может помочь разработчикам Node.js писать масштабируемый и эффективный код.

1. Замыкания JavaScript

Замыкание в JavaScript — это внутренняя функция, которая имеет доступ к области видимости своей внешней функции даже после того, как внешняя функция вернула управление. Замыкание делает переменные внутренней функции частными. Функциональное программирование приобрело огромную популярность, благодаря чему замыкания стали неотъемлемой частью набора разработчиков Node. Вот простой пример замыкания в JavaScript:

JavaScript concepts every Node developer must master

  • Переменной count назначена внешняя функция. Внешняя функция запускается только один раз, при этом счетчик обнуляется и возвращается внутренняя функция. Доступ к переменной _counter возможен только из внутренней функции, что делает ее ведущей как частная переменная.
  • Примером здесь является функция высшего порядка (или метафункция, функция, которая принимает или возвращает другую функцию). Замыкания встречаются во многих других приложениях. Замыкание происходит каждый раз, когда вы определяете функцию внутри другой функции, и внутренняя функция получает как собственную область видимости, так и доступ к родительской области — то есть внутренняя функция может «видеть» внешние переменные, но не наоборот.
  • Это также полезно с функциональными методами, такими как map(innerFunction), где innerFunction может использовать переменные, определенные во внешней области видимости.

2. Прототипы JavaScript

Каждая функция JavaScript имеет свойство прототипа, которое используется для присоединения свойств и методов. Это свойство не является перечислимым. Он позволяет разработчику присоединять к своим объектам методы или функции-члены. JavaScript поддерживает наследование только через свойство прототипа. В случае унаследованного объекта свойство прототипа указывает на родителя объекта. Распространенный подход к присоединению методов к функции — использование прототипов, как показано здесь:

JavaScript concepts every Node developer must master

Хотя современный JavaScript имеет довольно сложную поддержку классов, он по-прежнему использует систему прототипов. Это источник значительной гибкости языка.

3. Определение частных свойств с использованием хэш-имен

В былые времена соглашение о добавлении к переменным префикса подчеркивания использовалось для обозначения того, что переменная должна была быть частной. Однако это было всего лишь предложение, а не ограничение, налагаемое платформой. Современный JavaScript предлагает частные члены и методы с хэштегами для классов:

JavaScript concepts every Node developer must master

Частные хеш-имена — это новая и очень полезная функция JavaScript! Последние версии Node и браузеры поддерживают его, а инструменты разработчика Chrome позволяют для удобства напрямую обращаться к частным переменным.

4. Определение частных свойств с помощью замыканий

Другой подход, который иногда можно встретить для обхода отсутствия частных свойств в системе прототипов JavaScript, — это использование замыкания. Современный JavaScript позволяет определять частные свойства с помощью префикса хэштега, как показано в примере выше. Однако это не работает для системы прототипов JavaScript. Кроме того, этот трюк часто можно встретить в коде, и важно понимать, что он делает.

Определение частных свойств с помощью замыканий позволяет моделировать частную переменную. Функции-члены, которым необходим доступ к частным свойствам, должны быть определены в самом объекте. Вот синтаксис для создания частных свойств с использованием замыканий:

JavaScript concepts every Node developer must master

5. Модули JavaScript

Когда-то в JavaScript не было системы модулей, и разработчики придумали хитрый трюк (называемый шаблоном модуля), чтобы создать что-то, что работало. По мере развития JavaScript он породил не одну, а две системы модулей: синтаксис CommonJS include и синтаксис ES6 require.

Node традиционно использует CommonJS, а браузеры — ES6. Однако последние версии Node (за последние несколько лет) также поддерживают ES6. Сейчас тенденция заключается в использовании модулей ES6, и когда-нибудь у нас будет только один синтаксис модуля, который можно будет использовать во всем JavaScript. ES6 выглядит так (где мы экспортируем модуль по умолчанию, а затем импортируем его):

JavaScript concepts every Node developer must master

Вы по-прежнему будете видеть CommonJS, и иногда вам придется использовать его для импорта модуля. Вот как выглядит экспорт, а затем импорт модуля по умолчанию с помощью CommonJS:

JavaScript concepts every Node developer must master

6. Обработка ошибок

Независимо от того, на каком языке или в какой среде вы находитесь, обработка ошибок важна и неизбежна. Ноут не является исключением. Существует три основных способа обработки ошибок: блоки try/catch, выдача новых ошибок и обработчики on().

Блоки с функцией try/catch — это проверенное средство обнаружения ошибок, когда что-то идет не так:

JavaScript concepts every Node developer must master

В этом случае мы регистрируем ошибку на консоли с помощью console.error. Вы можете выбрать выдачу ошибки, передав ее следующему обработчику. Обратите внимание, что это нарушает выполнение потока кода; то есть текущее выполнение останавливается и его берет на себя следующий обработчик ошибок в стеке:

JavaScript concepts every Node developer must master

Современный JavaScript предлагает довольно много полезных свойств для своих объектов Error, включая Error.stack для просмотра трассировки стека. В приведенном выше примере мы устанавливаем свойство Error.message и Error.cause с аргументами конструктора.

Другое место, где вы можете обнаружить ошибки, — это блоки асинхронного кода, где вы обрабатываете обычные результаты с помощью .then(). В этом случае вы можете использовать обработчик on(’error’) или событие onerror, в зависимости от того, как обещание возвращает ошибки. Иногда API возвращает объект ошибки в качестве второго возвращаемого значения с нормальным значением. (Если вы используете await в асинхронном вызове, вы можете обернуть его в try/catch для обработки любых ошибок.) Вот простой пример обработки асинхронной ошибки:

JavaScript concepts every Node developer must master

Несмотря ни на что, никогда не проглатывайте ошибки! Я не буду это показывать здесь, потому что кто-то может это скопировать и вставить. По сути, если вы обнаружите ошибку и ничего не предпримете, ваша программа продолжит работу без каких-либо очевидных признаков того, что что-то пошло не так. Логика будет нарушена, и вам придется размышлять, пока вы не найдете пустой блок catch. (Обратите внимание: если использовать блок finally{} без блока catch, ваши ошибки будут проглочены.)

7. Каррирование в JavaScript

Каррирование — это метод повышения гибкости функций. С помощью каррированной функции вы можете передать все аргументы, которые ожидает функция, и получить результат, или вы можете передать только подмножество аргументов и получить обратно функцию, которая ожидает оставшуюся часть аргументов. Вот простой пример карри:

JavaScript concepts every Node developer must master

Исходную каррированную функцию можно вызвать напрямую, передав каждый из параметров в отдельном наборе круглых скобок, один за другим:

JavaScript concepts every Node developer must master

Это интересный метод, который позволяет создавать фабрики функций, где внешние функции позволяют частично настроить внутреннюю. Например, вы также можете использовать приведенную выше функцию каррирования следующим образом:

JavaScript concepts every Node developer must master

В реальном использовании эта идея может помочь, когда вам нужно создать множество функций, которые различаются в зависимости от определенных параметров.

8. Методы применения, вызова и привязки JavaScript

Хотя мы не каждый день их используем, полезно понимать, что такое методы call, apply и bind. Здесь мы имеем дело с серьезной языковой гибкостью. По сути, эти методы позволяют вам указать, к чему разрешается ключевое слово this.

Во всех трех функциях первым аргументом всегда является это значение или контекст, который вы хотите передать функции.

Из трех, вызов самый простой. Это то же самое, что вызвать функцию с указанием ее контекста. Вот пример:

JavaScript concepts every Node developer must master

Обратите внимание, что apply почти то же самое, что call. Единственное отличие состоит в том, что вы передаете аргументы как массив, а не отдельно. В JavaScript легче манипулировать массивами, что открывает больше возможностей для работы с функциями. Вот пример использования apply и call:

JavaScript concepts every Node developer must master

Метод bind позволяет передавать аргументы функции, не вызывая ее. Новая функция возвращается с ограниченными аргументами, предшествующими любым дальнейшим аргументам. Вот пример:

JavaScript concepts every Node developer must master

9. Запоминание JavaScript

Мемоизация — это метод оптимизации, который ускоряет выполнение функций за счет сохранения результатов дорогостоящих операций и возврата кэшированных результатов при повторном возникновении того же набора входных данных. Объекты JavaScript ведут себя как ассоциативные массивы, что упрощает реализацию запоминания в JavaScript. Вот как преобразовать рекурсивную функцию факториала в запоминаемую функцию факториала:

JavaScript concepts every Node developer must master

10. JavaScript IIFE

Выражение функции с немедленным вызовом (IIFE) — это функция, которая выполняется сразу после создания. Он не имеет никакой связи с какими-либо событиями или асинхронным выполнением. Вы можете определить IIFE, как показано здесь:

JavaScript concepts every Node developer must master

Первая пара круглых скобок function(){...} преобразует код внутри круглых скобок в выражение. Вторая пара круглых скобок вызывает функцию, полученную из выражения. IIFE также можно описать как самовызывающую анонимную функцию. Чаще всего его используют для ограничения области действия переменной, созданной с помощью var или для инкапсуляции контекста во избежание конфликтов имен.

Также бывают ситуации, когда вам нужно вызвать функцию с помощью await, но вы не находитесь внутри асинхронного функционального блока. Иногда это происходит с файлами, которые вы хотите сделать напрямую исполняемыми, а также импортировать как модуль. Вы можете обернуть такой вызов функции в блок IIFE следующим образом:

JavaScript concepts every Node developer must master

11. Полезные функции аргументации

Хотя JavaScript не поддерживает перегрузку методов (поскольку он может обрабатывать произвольное количество аргументов в функциях), у него есть несколько мощных средств для работы с аргументами. Во-первых, вы можете определить функцию или метод со значениями по умолчанию:

JavaScript concepts every Node developer must master

Вы также можете принимать и обрабатывать все аргументы одновременно, чтобы обрабатывать любое количество переданных аргументов. При этом используется оператор rest для сбора всех аргументов в массив:

JavaScript concepts every Node developer must master

Если вам действительно нужно иметь дело с разными конфигурациями аргументов, вы всегда можете их проверить:

JavaScript concepts every Node developer must master

Также помните, что JavaScript включает встроенный массив аргументов. Каждая функция или метод автоматически предоставляет вам переменную arguments, содержащую все аргументы, переданные в вызов.

Заключение

Познакомившись с Node, вы заметите, что существует множество способов решения практически каждой проблемы. Правильный подход не всегда очевиден. Иногда существует несколько действенных подходов к конкретной ситуации. Знание множества доступных вариантов помогает.

10 обсуждаемых здесь концепций JavaScript — это основы, которые будет полезно знать каждому разработчику Node. Но они — верхушка айсберга. JavaScript — мощный и сложный язык. Чем больше вы его используете, тем лучше вы поймете, насколько огромен JavaScript на самом деле и как много вы можете с ним сделать.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/usman_awan/10-javascript-concepts-every-node-developer-must-master-2na?1 Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить это
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3