Недавно я отлаживал небольшой код, написанный одним из моих коллег, и нашел что-то вроде этого в условном выражении внутри более крупной функции.
(function(foo){
...
console.info(foo);
...
})();
Так это выглядит очень скучно
function display(db, user, foo) {
if (isValid(db, user) {
(function(foo){
console.info(foo);
})();
}
...
}
Первоначально у него не было (); в конце, поэтому, насколько я понимаю, он даже не был вызван, но, на мой более широкий вопрос, в чем разница между этим и чем-то вроде ниже? Я видел этот синтаксис несколько раз, но не понимаю, насколько это может быть полезно для этой цели. Насколько я понимаю, это просто добавляет ненужной сложности. Кто-нибудь, пожалуйста, просветите меня!
function display(db, user, foo) {
if (isValid(db, user) {
// without abstract function
console.info(foo);
}
...
}
Спасибо :-)



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


В таком простом примере нет причин использовать анонимную функцию, подобную этой, в node.js или любой другой среде JavaScript, если бы вместо нее можно было вызвать внутреннюю функцию.
При проведении обзоров я часто предполагаю, что любой console.info (или ведение журнала с выбором языка) случаен. Если окружающий источник сам по себе не делает ничего ценного, он, вероятно, предназначен только для поддержки (возможно, устаревшего) console.info во время разработки и отладки.
Поскольку JavaScript является однопоточным, создание такой анонимной функции строго ограничено. В случае исходного источника, у которого не было исполнения (т.е. в нем отсутствовал ()), на самом деле это способ «скрыть» отладочный код от среды выполнения, оставив его на месте, если пошаговая отладка когда-либо нужно это.
При отладке это так же просто, как добавить ('isValid succeeded'), чтобы он выполнял весь исходный код внутри.
(function(foo){
console.info(foo);
})( /* You're missing a parameter value here; will print 'undefined'. */ );
Не могли бы вы привести мне пример того, какое значение параметра будет отсутствовать в круглых скобках выполнения?
На данный момент я думаю, что это был симптом синдрома ctrl + c ctrl + v, и кто-то забыл удалить эту часть.
Трудно сказать, какой здесь был предполагаемый параметр; в конце концов, это не TypeScript. Поскольку console.info с радостью регистрирует все, что вы ему бросаете, это даже не обязательно означает, что это должна быть строка. Я думаю, что главное здесь в том, что этот код был специально определен предыдущим разработчиком и оставлен невызванным, чтобы он не выполнялся при нормальной работе.
Иногда вы используете анонимную функцию, чтобы ограничить объем вашего кода. Это может пригодиться, если вы не хотите засорять глобальную область видимости своими переменными. Кроме того, это упрощает внедрение зависимостей для тестирования.
Рассмотрим следующие примеры:
var a = 2, b = 3;
function print(x)
{
console.info('x= ', x);
}
print(a+b);
В приведенном выше примере a, b и print теперь принадлежат объекту окна. Когда ваш код растет, становится трудно отслеживать и избегать конфликтов имен. Проблема становится еще более серьезной, если вы используете сторонние библиотеки и т. д.
В приведенном ниже примере ваш код заключен в анонимную функцию, защищающую глобальную область видимости. Вы также можете передать параметры анонимной функции
(function(localParam){
var a = 2, b = 3;
function print(x)
{
console.info('x= ', x);
}
print(a+b);
//also
console.info(localParam); // = safe way to access and global variables
})(globalParam);
globalParam у вас есть. Это используется в анонимной функции. В каком объеме будет находиться globalParm?
globalParam - это что-то из родительской или глобальной области для передачи в локальную (внутри замыкания) область видимости.
Тот, кто сам хочет знать ответ на вопрос, думаю, вопрос должен быть "когда использовать анонимную функцию в nodeJS". Просто предложение :)