ТС хотел сложения для 3 аргументов
|
caetus,
да это понятно, но меня заинтересовало как бы выглядел универсальный складыватель) |
вас интересует реализация без valueOf ?
|
мне понравилось эта реализация:
function sum() {
var res;
sum.res = sum.res || 0;
sum.arg = sum.arg || 0;
sum.arg += arguments.length;
for (var i = 0; i < arguments.length; i++) sum.res += arguments[i];
if(sum.arg == 3){
res = sum.res;
sum.arg = sum.res = 0;
}else{
res = sum;
}
return res;
}
Когда функция в свой объекте хранит свое состояние и в зависимости от него реагирует - возвращать ли функцию или переменную. Вот только это реализуемо если мы знаем возможные комбинации вызова, а как бы такую штуку реализовать на всевозможные комбинации вызова? |
var add = function () {
var orig = 0;
var inner = function () {
for(var i = 0; i < arguments.length; i++) orig += arguments[i];
return inner
};
inner.valueOf = function () {return orig;};
return inner.apply(this, arguments);
};
console.log(add(2,1,1)(2)(5)+2)
console.log(add(5));
console.log(add(2,5))
|
консоль выдает
13 function 5 function 7 я правильно понимаю, что function появляется из-за valueOf? А без него реализация невозможна? |
|
caetus, блин, жалко, идея действительно впечатляет.
Как вариант, правда совсем дурацкий я бы предложил такое - делаем состояние с суммой по setTimeout и отслеживаем в этом состоянии вызовы функции в течении ну скажем 10-20 милисекунд, думаю эту любую строку с разумным вызовом функции успеет запустить, и по истечению уже выдавать результат. Пока печатал решил затестить и понял что проблема будет в консол.логе, он выдаст undefined не дожидаясь ответа) |
function summ() {
var summator = function(args) {
return [].slice.call(args).reduce((s, c) => s + c);
};
var count = 0;
var f = function() {
count += summator(arguments);
return f;
};
f.valueOf = function() {
return count;
};
return f.apply(null, arguments);
}
console.log(+summ(1)(2)(3)(4));
console.log(+summ(1)(2, 3, 4));
console.log(+summ(1, 2)(3, 4));
console.log(+summ(1, 2, 3)(4));
console.log(+summ(1, 2, 3, 4));
не полностью без знаков, но тоже вроде ничего) |
что жалко ? функцию можно смело использовать !
|
| Часовой пояс GMT +3, время: 22:46. |