Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 14.01.2016, 16:02
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

ТС хотел сложения для 3 аргументов
Ответить с цитированием
  #22 (permalink)  
Старый 14.01.2016, 16:20
Профессор
Отправить личное сообщение для Siend Посмотреть профиль Найти все сообщения от Siend
 
Регистрация: 04.02.2012
Сообщений: 196

caetus,
да это понятно, но меня заинтересовало как бы выглядел универсальный складыватель)
Ответить с цитированием
  #23 (permalink)  
Старый 14.01.2016, 16:25
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

вас интересует реализация без valueOf ?
Ответить с цитированием
  #24 (permalink)  
Старый 14.01.2016, 16:34
Профессор
Отправить личное сообщение для Siend Посмотреть профиль Найти все сообщения от Siend
 
Регистрация: 04.02.2012
Сообщений: 196

мне понравилось эта реализация:
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;
}

Когда функция в свой объекте хранит свое состояние и в зависимости от него реагирует - возвращать ли функцию или переменную. Вот только это реализуемо если мы знаем возможные комбинации вызова, а как бы такую штуку реализовать на всевозможные комбинации вызова?

Последний раз редактировалось Siend, 14.01.2016 в 16:41.
Ответить с цитированием
  #25 (permalink)  
Старый 14.01.2016, 16:44
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

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))
Ответить с цитированием
  #26 (permalink)  
Старый 14.01.2016, 17:00
Профессор
Отправить личное сообщение для Siend Посмотреть профиль Найти все сообщения от Siend
 
Регистрация: 04.02.2012
Сообщений: 196

консоль выдает
13
function 5
function 7

я правильно понимаю, что function появляется из-за valueOf? А без него реализация невозможна?
Ответить с цитированием
  #27 (permalink)  
Старый 14.01.2016, 17:02
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

правильно
https://learn.javascript.ru/object-conversion
Ответить с цитированием
  #28 (permalink)  
Старый 14.01.2016, 17:15
Профессор
Отправить личное сообщение для Siend Посмотреть профиль Найти все сообщения от Siend
 
Регистрация: 04.02.2012
Сообщений: 196

caetus, блин, жалко, идея действительно впечатляет.
Как вариант, правда совсем дурацкий я бы предложил такое -
делаем состояние с суммой по setTimeout и отслеживаем в этом состоянии вызовы функции в течении ну скажем 10-20 милисекунд, думаю эту любую строку с разумным вызовом функции успеет запустить, и по истечению уже выдавать результат.

Пока печатал решил затестить и понял что проблема будет в консол.логе, он выдаст undefined не дожидаясь ответа)
Ответить с цитированием
  #29 (permalink)  
Старый 14.01.2016, 17:42
Кандидат Javascript-наук
Отправить личное сообщение для yazonnile Посмотреть профиль Найти все сообщения от yazonnile
 
Регистрация: 25.05.2012
Сообщений: 133

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));


не полностью без знаков, но тоже вроде ничего)
Ответить с цитированием
  #30 (permalink)  
Старый 14.01.2016, 17:44
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

что жалко ? функцию можно смело использовать !
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Варианты сохранения массивов (из js) на сервере? romm Общие вопросы Javascript 8 17.01.2015 14:08
Прошу оценить варианты цветовой гаммы, жду ваших советов Adriano Ваши сайты и скрипты 2 05.01.2014 17:35
Составить алгоритм и программу для решения следующей задачи. Даны два массива X (5), rjabijj Общие вопросы Javascript 2 05.07.2012 22:02
Добавить варианты в поле <inpute type=text> softrix AJAX и COMET 2 06.07.2010 12:07
Варианты решения задачи bobri4 Элементы интерфейса 1 07.10.2009 01:41