Я вижу разные способы написания кодировщиками функции module.exports.
1-й:
module.exports = function() {
return (async () => {
})()
}
2-й:
module.exports = async () => {
}
В чем разница между 1-м и 2-м способами?
И зачем сначала возвращать функцию async () в уже определенной функции.
И во 2-м способе мы не вызываем функцию, как в 1-м способе.
Может ли кто-нибудь помочь мне понять эту концепцию.
Я очень новичок в Javascript



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Фрагмент 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 обычно является предпочтительным способом.
Это ни в коем случае не полный ответ, поскольку полный ответ потребует слишком много подробностей. Это должен быть комментарий, но он все еще слишком длинный. Надеюсь, этого будет достаточно, чтобы вы могли начать самостоятельное исследование.
Важно отметить, что 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
Есть также асинхронные функции, функции, которым предшествует ключевое слово async и которые позволяют обрабатывать данные в фоновом режиме. Вы можете узнать больше об асинхронных функциях здесь: http://2ality.com/2016/02/async-functions.html.
Я не связан с 2ality.com, но это действительно хороший ресурс.
Удачи!
Первый возвращает обещание, которое является результатом вызова асинхронной функции. Второй возвращает (не вызываемую) асинхронную функцию.