Dois conjuntos de parênteses após a chamada de função

168

Eu estava olhando como os filtros funcionam no Angularjs e vi que precisamos enviar 2 conjuntos de parênteses.

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

O que significa e como lidamos com JavaScript?

L105
fonte
7
Pessoalmente, acho essa sintaxe confusa / desagradável de ler também. Mas você pode usar sintaxe mais simples para acesso AngularJS filtros como descrito aqui: stackoverflow.com/a/14303362/1418796
pkozlowski.opensource
Tomei angularjs como um exemplo. Eu queria saber como lidar com isso se eu mesmo criar uma função.
L105
4
Na verdade, é chamado de "currying". uma técnica de programação.
Sajuuk 26/07

Respostas:

331

Isso significa que a primeira função ( $filter) retorna outra função e, em seguida, essa função retornada é chamada imediatamente. Por exemplo:

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

var addTwo = add(2);

addTwo(4) === 6; // true
add(3)(4) === 7; // true
Paulo
fonte
14
Com as funções de seta do ES6, você pode escrevê-lo da seguinte maneira:let add = (x) => (y) => x + y;
guido
2
Chame-me de Noob, mas poupe seu tempo para explicar como a sub-função é capaz de manter o valor dex
Vikas Bansal
2
@VikasBansal Toda vez que uma função é chamada em Javascript, um novo contexto de execução é criado, desde que haja uma referência a outra função dentro dela, que o contexto de execução ficará na memória.
Paul
11
Por que não passar apenas 2 argumentos como add(x, y)? Onde está o benefício de chamá-lo assim?
Piotr Pawlik
1
Obrigado por esta explicação! Realmente me ajudou a entender a autenticação funciona como passportjs:passport.authenticate("local")(req, res, function(){
tidydee
22

$filter('number') retorna uma função que aceita dois argumentos, sendo o primeiro obrigatório (um número) e o segundo opcional (o tamanho da fração).

É possível chamar imediatamente a função retornada:

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

Como alternativa, você pode manter a função retornada para uso futuro:

var numberFilter = $filter('number');

numberFilter('123')
Ja͢ck
fonte
isto; parece complexo: export const toursListQuery = gql` consulta ToursListQuery {tours {id name}} `; exportar graphql padrão (toursListQuery, {options: {pollInterval: 10000},}) (ToursList);
stackdave
7

É o mesmo que isto:

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

A $filter()função retorna um ponteiro para outra função.

Bryan Oakley
fonte