Два набора скобок после вызова функции

168

Я смотрел, как фильтры работают в Angularjs, и я увидел, что нам нужно отправить 2 набора скобок.

$filter('number')(number[, fractionSize])

Что это значит и как мы справляемся с этим с помощью JavaScript?

L105
источник
7
Лично я нахожу этот синтаксис непонятным / неудобным для чтения. Но вы можете использовать более простой синтаксис для доступа к фильтрам AngularJS, как описано здесь: stackoverflow.com/a/14303362/1418796
pkozlowski.opensource
Я взял angularjs в качестве примера. Я хотел знать, как справиться с этим, если я сам создаю функцию.
L105
4
На самом деле это называется "карри". методика программирования.
Саюк

Ответы:

331

Это означает, что первая функция ( $filter) возвращает другую функцию, а затем эта возвращаемая функция вызывается немедленно. Например:

function add(x){
  return function(y){
    return x + y;
  };
}

var addTwo = add(2);

addTwo(4) === 6; // true
add(3)(4) === 7; // true
Павел
источник
14
С помощью функций стрелок ES6 вы можете написать это следующим образом:let add = (x) => (y) => x + y;
Guido
2
Назовите меня нубом, но, пожалуйста, уделите время тому, чтобы объяснить, как подфункция способна удерживать значениеx
Викас Бансал,
2
@VikasBansal Каждый раз, когда функция вызывается в Javascript, создается новый контекст выполнения, если в нем есть ссылка на другую функцию, которая будет оставаться в памяти.
Paul
11
Почему бы просто не передать 2 аргумента, как add(x, y)? Где польза от такого?
Петр Павлик
1
Спасибо за это объяснение! Действительно помог мне понять, как работает аутентификация passportjs:passport.authenticate("local")(req, res, function(){
tidydee
22

$filter('number') возвращает функцию, которая принимает два аргумента, первый из которых является обязательным (число), а второй необязательным (размер дроби).

Можно сразу вызвать возвращенную функцию:

$filter('number')('123')

В качестве альтернативы вы можете сохранить возвращенную функцию для будущего использования:

var numberFilter = $filter('number');

numberFilter('123')
Разъем
источник
этот; выглядит сложным: экспорт const toursListQuery = gql` запрос ToursListQuery {tours {id name}} `; экспорт по умолчанию graphql (toursListQuery, {options: {pollInterval: 10000},}) (ToursList);
Staddave
7

Это так же, как это:

var func = $filter('number');
func(number[, fractionSize]);

$filter()Функция возвращает указатель на другую функцию.

Брайан Оукли
источник