Объявить функцию без имени в JavaScript - PullRequest
3 голосов
/ 05 июня 2019

Я новичок в JavaScript (из Java) и хочу понять эту функцию

(function (global, factory) {
if (typeof define === 'function' && define.amd) {
    define(['../numeral'], factory);
} else if (typeof module === 'object' && module.exports) {
    factory(require('../numeral'));
} else {
    factory(global.numeral);
}

}

Это с этой страницы github https://github.com/adamwdraper/Numeral-js/blob/master/src/formats/currency.js

Myвопрос: почему нет имени для функции, которая принимает global и factory в качестве параметра?

То, что я ожидал, выглядит примерно так:

function myFunction(p1, p2) {
return p1 * p2;   // The function returns the product of p1 and p2
}

Здесь у нас есть имя myFunction, но в приведенном выше примере у нас нет имени для функции.Зачем?И почему это разрешено в JavaScript?

Ответы [ 3 ]

2 голосов
/ 05 июня 2019

Да.Они называются анонимными функциями в Javascript.

Обычно эти функции предоставляются в качестве обратных вызовов для другой функции.

Или они могут быть немедленно вызваны, как сказал Джек в своем ответе.

1 голос
/ 05 июня 2019

Анонимные функции - это просто функции без имен. Они не могут быть вызваны по имени, как если бы вы обычно использовали функцию. На самом деле мы часто их используем в javascript.

Широко используется для функции, которая принимает в качестве параметра другую функцию, например .sort(). Сортировка позволяет вам передать пользовательскую функцию для обработки логики сортировки, поэтому с анонимной функцией это будет выглядеть так:

var numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
  return a - b;
});
//[1, 2, 3, 4, 5]

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

var numbers = [4, 2, 5, 1, 3];
var mySortFunction = function(a, b){
   return a - b;
}
numbers.sort(mySortFunction);
//[1, 2, 3, 4, 5]

Анонимные функции - это простой и быстрый способ создания функций, которые вы бы не использовали в своем коде.

1 голос
/ 05 июня 2019

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

Это так:

var func = function (global, factory) {
    if (typeof define === 'function' && define.amd) {
        define(['../numeral'], factory);
    } else if (typeof module === 'object' && module.exports) {
        factory(require('../numeral'));
    } else {
        factory(global.numeral);
    }
}

Вы называете это как:

(func)();

Или:

func();

Это функциональное выражение - у него нет имени, оно присваивается именованной переменной. Безымянные функции известны как анонимные функции, и вы используете их как функции тестирования / обратного вызова.

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