Частичное применение Javascript

996
17 июня 2017, 15:01

Есть такая задача(вот тут):

Напиши функцию partial(fn, a1, a2, ....), которая позволяет зафиксировать один или несколько аргументов функции. Пример:

function add(a, b) { return a + b; }
function mult(a, b, c, d) { return a * b * c * d; }
var add5 = partial(add, 5); // Мы получили функцию с 1 аргументом, которая прибавляет к любому числу 5
console.log(add5(2)); // 7
console.log(add5(10)); // 15
console.log(add5(8)); // 13
var mult23 = partial(mult, 2, 3); // мы зафиксировали первые 2 аргумента mult() как 2 и 3
console.log(mult23(4, 5)); // 2*3*4*5 = 120
console.log(mult23(1, 1)); // 2*3*1*1 = 6

подскажите, как это делается. как вернуть функцию с уже вписанными аргументами?

Answer 1

Первое, что должна делать функция partial - это возвращать функцию.

function partial(fn, ...partialArgs){
    return function(...args){
        ...
    }
}

внутри этой функции должна вызываться функция fn, которой должны передаваться аргументы partialArgs, а также аргументы args, которые передадут непосредственно при вызове.

Для вызова функции с неизвестным заранее количеством параметров нужно использовать метод apply

fn.apply(this,partialArgs.concat(args));

Так как apply принимает только одну коллекцию параметров, объединим массивы аргументов с помощью метода concat

Пример:

function partial(fn, ...partialArgs) { 
  return function(...args) { 
    return fn.apply(this, partialArgs.concat(args)); 
  } 
} 
 
function add(a, b) { 
  return a + b; 
} 
 
function mult(a, b, c, d) { 
  return a * b * c * d; 
} 
 
var add5 = partial(add, 5); // Мы получили функцию с 1 аргументом,  
 
console.log(add5(2)); // 7 
console.log(add5(10)); // 15 
console.log(add5(8)); // 13 
 
var mult23 = partial(mult, 2, 3); // мы зафиксировали первые 2 аргумента mult() как 2 и 3 
 
console.log(mult23(4, 5)); // 2*3*4*5 = 120 
console.log(mult23(1, 1)); // 2*3*1*1 = 6

READ ALSO
PM2 слежение за файлами nodejs

PM2 слежение за файлами nodejs

запустил сервер через pm2 appjs --watch чтоб он следил за файлами и перезапускал сервер

282
Как узнать координату созданной метки

Как узнать координату созданной метки

Есть код с yandex api, тут круто реализовано создание меток, но вопрос

401
Посчитать сумму заказа в корзине сайта

Посчитать сумму заказа в корзине сайта

Добрый день! Корзина сайта, по изменению количества меняется стоимость 1 товараТоваров может быть неограничено

314
Javascript функции с перечислением

Javascript функции с перечислением

Мне нужно создать функцию такой структуры

283