странный способ передачи аргументов в express. js исходном коде - PullRequest
2 голосов
/ 20 января 2020

Когда я искал исходный код маршрутизатора express, я увидел это:

    var debug = require('debug')('express:router:route');

Может кто-нибудь объяснить, что означает этот способ передачи аргументов?

Ответы [ 3 ]

4 голосов
/ 20 января 2020

В Javascript функции являются «первым классом», что означает, что они могут передаваться как любые другие значения.

require('debug') возвращает функцию. Например, экспорт пакета debug npm по умолчанию является функцией, а не объектом.

Эта функция затем вызывается со строкой "express:router:route"

Функция, которая принимает в каком-то состоянии или конфигурации и возвращает функцию, основанную на этом состоянии или конфигурации, частичное применение . Это не случай частичного применения, однако, это просто сокращение для:

var debug = require('debug');
debug('express:router:route');

require не функция, которая предназначена для частичного применения, это просто означает, что пакет debug возвращает функцию и выполняется на месте.

3 голосов
/ 20 января 2020

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

Немного сложно разобраться, но стоит изучить

Что такое карринг?

Карринг - это процесс в функциональном программировании, в котором мы можем преобразовать функцию с несколькими аргументами в последовательность вложенных функций. Он возвращает новую функцию, которая ожидает следующий встроенный аргумент. Он продолжает возвращать новую функцию (которая ожидает текущий аргумент, как мы говорили ранее), пока все аргументы не будут исчерпаны. Аргументы остаются «живыми» (через замыкание), и все они используются при выполнении, когда возвращается и выполняется последняя функция в цепочке каррирования.

Дополнительная информация здесь: https://blog.bitsrc.io/understanding-currying-in-javascript-ceb2188c339

1 голос
/ 20 января 2020

Посмотрите на пакет debug ( ссылка ):

debug предоставляет функцию; просто передайте этой функции имя вашего модуля, и он вернет оформленную версию console.error, чтобы вы могли передавать отладочные операторы. Это позволит вам переключать выходные данные отладки для различных частей вашего модуля, а также для модуля в целом.

Итак, require('debug') возвращает функцию. Эту функцию можно вызвать, выполнив require('debug')(some parameter). Это означает, что возможно следующее (пример взят из debug документов, связанных выше):

var debug = require('debug')('http')

Теперь переменная debug указывает на результат вызова возвращенной функции require('debug') с параметром 'http'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...