Deux ensembles de parenthèses après l'appel de fonction

168

Je regardais comment les filtres fonctionnent dans Angularjs et j'ai vu que nous devions envoyer 2 jeux de parenthèses.

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

Qu'est-ce que cela signifie et comment le gérer avec JavaScript?

L105
la source
7
Personnellement, je trouve cette syntaxe déroutante / difficile à lire également. Mais vous pouvez utiliser une syntaxe plus simple pour accéder aux filtres AngularJS comme décrit ici: stackoverflow.com/a/14303362/1418796
pkozlowski.opensource
J'ai pris angularjs comme exemple. Je voulais savoir comment gérer cela si je crée moi-même une fonction.
L105
4
En fait, ça s'appelle "curry". une technique de programmation.
Sajuuk

Réponses:

331

Cela signifie que la première fonction ( $filter) renvoie une autre fonction, puis que la fonction retournée est appelée immédiatement. Par exemple:

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

var addTwo = add(2);

addTwo(4) === 6; // true
add(3)(4) === 7; // true
Paul
la source
14
Avec les fonctions fléchées ES6, vous pouvez l'écrire de la manière suivante:let add = (x) => (y) => x + y;
guido
2
Appelez-moi un Noob, mais prenez votre temps pour expliquer comment une sous-fonction peut conserver la valeur dex
Vikas Bansal
2
@VikasBansal Chaque fois qu'une fonction est appelée en Javascript, un nouveau contexte d'exécution est créé, tant qu'il y a une référence à une autre fonction à l'intérieur, ce contexte d'exécution restera en mémoire.
Paul
11
Pourquoi ne pas simplement passer 2 arguments comme add(x, y)? Où est l'avantage de l'appeler ainsi?
Piotr Pawlik
1
Merci pour cette explication! passport.authenticate("local")(req, res, function(){
M'a
22

$filter('number') renvoie une fonction qui accepte deux arguments, le premier étant obligatoire (un nombre) et le second étant facultatif (la taille de la fraction).

Il est possible d'appeler immédiatement la fonction retournée:

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

Vous pouvez également conserver la fonction renvoyée pour une utilisation future:

var numberFilter = $filter('number');

numberFilter('123')
Jack
la source
ce; semble complexe: export const toursListQuery = gql` query ToursListQuery {tours {id name}} `; exporter graphql par défaut (toursListQuery, {options: {pollInterval: 10000},}) (ToursList);
stackdave
7

C'est la même chose:

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

La $filter()fonction renvoie un pointeur vers une autre fonction.

Bryan Oakley
la source