В чем разница в написании функции module.exports?

Я вижу разные способы, которыми кодеры пишут функцию module.exports.

1st:

module.exports = function() {
  return (async () => {

  })()
}

2nd:

module.exports = async () => {

}

В чем разница между 1-м и 2-м способами?

И зачем возвращать функцию async () в уже определенную функцию, в первую очередь. И во втором случае мы не вызываем функцию, как в первом случае.

Может ли кто-нибудь помочь мне понять эту концепцию. Я новичок в Javascript


person Manchukonda Manoj    schedule 22.05.2018    source источник
comment
Первый возвращает обещание, которое является результатом вызова асинхронной функции. Второй возвращает (невызванную) асинхронную функцию.   -  person CertainPerformance    schedule 22.05.2018


Ответы (2)


Фрагмент 1 — это обычная функция, использующая IIFE, а фрагмент 2 — функция стрелки. Обе функции возвращают промисы, потому что async является синтаксическим сахаром для функции, возвращающей промисы.

IIFE обычно используются для предотвращения утечки переменных в глобальную область видимости. Это не проблема в Node, потому что код выполняется в области модуля.

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

var foo; // not a probem; it pollutes module namespace but doesn't leak anywhere
module.exports = function() {
  var foo; // can have another foo here, but it could be defined inside async
  return (async () => {/*...*/})()
}

Фрагменты 1 и 2 ведут себя по-разному из-за различий между обычными и стрелочными функциями. Функция во фрагменте 1 может быть привязана, использовать arguments и т. д., а функция во фрагменте 2 — нет.

Фрагмент 2, как правило, предпочтительнее.

person Estus Flask    schedule 22.05.2018

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

Самое важное, что следует отметить, это то, что module.exports и функции — это два понятия в javascript, которые не связаны напрямую друг с другом.

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

module.exports = ""; //exports a string
module.exports = {name:"john"}; //exports an object
module.exports = 3.14159; //exports a number

функции — это одни из многих «вещей» в javascript. В общем, их цель — взять что-то и что-то с этим сделать. Существуют в основном две формы:

function(){ } 

а также

()=>{}

Вы можете узнать больше о разнице между двумя формами здесь: http://2ality.com/2012/04/arrow-functions.html

Существуют также асинхронные функции, которые представляют собой функции, которым предшествует ключевое слово "асинхронный" и которые позволяют выполнять обработку в фоновом режиме. Вы можете узнать больше об асинхронных функциях здесь: http://2ality.com/2016/02/async-functions.html.

Я не связан с 2ality.com, но это действительно хороший ресурс.

Удачи!

person John Henry    schedule 22.05.2018