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?


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

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')

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.