Вопрос по методу bind

Функция должна принимать другую функцию (F) и некоторое количество дополнительных аргументов Функция должна привязать переданные аргументы к функции (F) и вернуть получившуюся функцию Пример:

function sum(a, b) {
return a + b;
}
var newSum = bindFunction(sum, 2, 4);
console.log(newSum()) выведет 6

Конкретный пример я решил вот так

function sum(a, b) {
    return a + b;
}

var newSum = sum.bind(sum, 2, 4);
console.log(newSum()) 

Но не могу разобраться как сделать имея неизвестное заранее число аргументов?


Ответы (2 шт):

Автор решения: Zhihar
function sum(...args) {
    let sum = 0;
    for (value of args) {
        sum += value;
    }
    return sum;
}

var newSum = sum.bind(sum, 2, 4, 6, 10);
console.log(newSum())
→ Ссылка
Автор решения: Qwertiy
  1. При наличии ES6 - проще всего через spread operator.
  2. Иначе через apply и arguments.

function forES6(f, ...args) {
  return f.bind(null, ...args)
}

function forES6nb(f, ...args) {
  return function (...other) {
    return f(...args, ...other)
  }
}

function forOlder(f) {
  var args = Array.prototype.slice.call(arguments)
  args[0] = null

  return function () {
    return f.apply(null, args.concat(Array.prototype.slice.call(arguments)))
  }
}

function f(...args) {
  return args.reduce((x, y) => x + y, 0)
}

for (var args1 of [[], [1], [1,2], [1,2,3]]) {
  for (var args2 of [[], [10], [10,20], [10,20,30]]) {
    console.log(
      `(${args1})(${args2})`,
      forES6(f, ...args1)(...args2),
      forES6nb(f, ...args1)(...args2),
      forOlder(f, ...args1)(...args2),
    )
  }
}
.as-console-wrapper.as-console-wrapper { max-height: 100vh }

→ Ссылка