Вопрос по методу 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
→ Ссылка
- При наличии ES6 - проще всего через spread operator.
- Иначе через 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 }