Dwa zestawy nawiasów po wywołaniu funkcji

168

Sprawdzałem, jak działają filtry w Angularjs i zobaczyłem, że musimy wysłać 2 zestawy nawiasów.

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

Co to oznacza i jak sobie z tym radzimy w JavaScript?

L105
źródło
7
Osobiście uważam, że ta składnia jest również myląca / niezręczna do czytania. Ale możesz użyć prostszej składni, aby uzyskać dostęp do filtrów AngularJS, jak opisano tutaj: stackoverflow.com/a/14303362/1418796
pkozlowski.opensource
Jako przykład wziąłem angularjs. Chciałem wiedzieć, jak sobie z tym poradzić, jeśli sam utworzę funkcję.
L105
4
Właściwie nazywa się to „curry”. technika programowania.
Sajuuk

Odpowiedzi:

331

Oznacza to, że pierwsza funkcja ( $filter) zwraca inną funkcję, a następnie ta zwrócona funkcja jest wywoływana natychmiast. Na przykład:

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

var addTwo = add(2);

addTwo(4) === 6; // true
add(3)(4) === 7; // true
Paweł
źródło
14
Dzięki funkcjom strzałkowym ES6 można to zapisać w następujący sposób:let add = (x) => (y) => x + y;
guido
2
Nazwij mnie Noobem, ale poświęć swój czas na wyjaśnienie, w jaki sposób funkcja podrzędna może utrzymać wartośćx
Vikas Bansal
2
@VikasBansal Za każdym razem, gdy funkcja jest wywoływana w JavaScript, tworzony jest nowy kontekst wykonania, o ile istnieje w niej odniesienie do innej funkcji, ten kontekst wykonania pozostanie w pamięci.
Paul
11
Dlaczego nie przekazać po prostu 2 argumentów, takich jak add(x, y)? Jaka jest korzyść z tak tego nazwania?
Piotr Pawlik
1
Dzięki za to wyjaśnienie! Naprawdę pomogło mi zrozumieć, jak działa uwierzytelnianie paszportjs:passport.authenticate("local")(req, res, function(){
tidydee
22

$filter('number') zwraca funkcję, która przyjmuje dwa argumenty, z których pierwszy jest wymagany (liczba), a drugi opcjonalny (rozmiar ułamka).

Możliwe jest natychmiastowe wywołanie zwróconej funkcji:

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

Alternatywnie możesz zachować zwróconą funkcję do wykorzystania w przyszłości:

var numberFilter = $filter('number');

numberFilter('123')
Jacek
źródło
to; wygląda na skomplikowaną: eksportuj const toursListQuery = gql` query ToursListQuery {tours {nazwa id}} `; eksportuj domyślny graphql (toursListQuery, {opcje: {pollInterval: 10000},}) (ToursList);
stackdave
7

Jest taki sam jak ten:

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

$filter()Funkcja zwraca wskaźnik do innej funkcji.

Bryan Oakley
źródło