Dos conjuntos de paréntesis después de la llamada a la función

168

Estaba mirando cómo funcionan los filtros en Angularjs y vi que necesitamos enviar 2 conjuntos de paréntesis.

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

¿Qué significa y cómo lo manejamos con JavaScript?

L105
fuente
77
Personalmente, encuentro esta sintaxis confusa / incómoda de leer también. Pero puede usar una sintaxis más simple para acceder a los filtros AngularJS como se describe aquí: stackoverflow.com/a/14303362/1418796
pkozlowski.opensource
Tomé angularjs como un ejemplo. Quería saber cómo manejar esto si creo una función yo mismo.
L105
44
En realidad se llama "curry". Una técnica de programación.
Sajuuk

Respuestas:

331

Significa que la primera función ( $filter) devuelve otra función y luego esa función devuelta se llama inmediatamente. Por ejemplo:

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

var addTwo = add(2);

addTwo(4) === 6; // true
add(3)(4) === 7; // true
Pablo
fuente
14
Con las funciones de flecha ES6, podría escribirlo de la siguiente manera:let add = (x) => (y) => x + y;
guido
2
Llámame novato, pero tómate tu tiempo para explicar cómo la subfunción puede mantener el valor dex
Vikas Bansal
2
@VikasBansal Cada vez que se llama a una función en Javascript, se crea un nuevo contexto de ejecución, siempre que haya una referencia a otra función dentro de él, ese contexto de ejecución permanecerá en la memoria.
Paul
11
¿Por qué no simplemente pasar 2 argumentos como add(x, y)? ¿Dónde está el beneficio de llamarlo así?
Piotr Pawlik
1
Gracias por esta explicación! Realmente me ayudó a comprender cómo funciona la autenticación de passportjs:passport.authenticate("local")(req, res, function(){
tidydee
22

$filter('number') devuelve una función que acepta dos argumentos, el primero requerido (un número) y el segundo opcional (el tamaño de la fracción).

Es posible llamar de inmediato a la función devuelta:

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

Alternativamente, puede mantener la función devuelta para uso futuro:

var numberFilter = $filter('number');

numberFilter('123')
Jack
fuente
esta; se ve complejo: export const toursListQuery = gql` query ToursListQuery {tours {id name}} `; exportar graphql predeterminado (toursListQuery, {opciones: {pollInterval: 10000},}) (ToursList);
stackdave
7

Es lo mismo que esto:

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

La $filter()función devuelve un puntero a otra función.

Bryan Oakley
fuente