2014-10-02 2 views
0

Сегодня я нашел странный способ добавления 2 числа в JavaScript:Как может быть полезен синтаксис `foo (a) (b)`?

В основном вызов метода выглядит следующим образом: add(5)(6) и декларацию метода:

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

Хорошо, я получил Это. Функция add не возвращает число, но возвращает анонимную функцию, которая добавляет первое число со вторым. Но в чем смысл (как это может быть полезно)?

Где именно это может быть полезно, кроме как запутать других людей или написать какое-то запутанное вредоносное ПО?

+3

Вы спрашиваете, в чем смысл возврата функций, или вы спрашиваете, в чем смысл иметь функцию «добавить» в карри? Этот конкретный случай может быть не самым универсально полезным, но это не должно быть. – Ryan

+0

Я предполагаю, что они думали, что цепочка аргументов объединяется так, как это, вместо того, чтобы писать имя функции более одного раза, было более прохладно. :) –

+0

@minitech Я спрашиваю, как полезно использовать foo (a) (b). Добавить функцию просто пример.Спасибо, что рассказали название этой техники. –

ответ

1

Очевидно, что звонок add(5)(6) не слишком полезен - вы бы предпочли написать 5 + 6 или, если это действительно функция, add(5, 6).

Огромное преимущество в функциональном программировании, где вы должны пропускать функцию (обратный вызов!) - наиболее заметный в array utils. Например:

[1, 2, 3].map(add(5)) // [6, 7, 8] 

Вы также можете использовать это для композиции из довольно сложных функций, без необходимости иметь дело с функциональными выражениями. Если у нас не был эта выделанной add функции, в приведенном выше примере мы нуждались бы написать

[1, 2, 3].map(function(y) { 
    return 5 + y; 
}) // [6, 7, 8] 

... и что каждый раз, когда для каждого отдельного x.

0

Вы не обязательно использовать его как вы описали, но, возможно, если вы хотите, чтобы обойти функцию, которая «добавляет 5 к результату», вы могли бы сделать

var addsFive = add(5); 
// some other code, perhaps passing this var to another function 
var result = addsFive(6); // returns 11 

Эта техника " частичный "вызов функции называется currying - this other SO question рассказывает о том, как/где он может быть полезен, а также содержит несколько ссылок, которые помогут объяснить концепцию.

+0

Привет анонимный downvoter - есть ли что-то неправильное или что нужно улучшить об этом ответе? – Krease

1

Давайте посмотрим на функцию, которая является немного более распространенным в дикой природе, pluck:

function pluck(prop) { 
    return function(obj) { 
     return obj[prop]; 
    } 
} 

Эта функция принимает имя свойства и возвращает новую функцию, которая, с учетом объекта, возвращает свойство этот объект.

Это полезно для отображения массивов объектов в массив определенного свойства этих объектов:

var names = people.map(pluck('name')); 

Теперь, если вы просто должны сделать это один раз, нет необходимости создавать специальная функция pluck. Однако, если вы делаете это несколько раз, это позволяет избежать повторения кода.

Смежные вопросы