scepter
@scepter
web-dev

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

Сразу прошу прощения за формулировку вопроса. Имеется функция func(f1, gen), где gen - функция-генератор, а f1 - функция, обрабатывающая каждое значение генератора при вызове func().
Например, у меня есть следующий генератор:

function createCounter(start, step) {
  return function(){
    if (start === undefined)
      start = 0;
    if(step === undefined)
      step = 1;
    start+=step;
    return start - step;
  };
}

А в качестве обрабатывающей функции f1:
function pow(x) {
  return x * x;
}


Функция func:
function func(f1, gen) {
  return function() {      //эта функция должна передать все аргументы в функцию gen;
    // исходный код
  };
}

Т.е. мне нужно следующее:
var gen1 = createCounter(1,1);
function powGen = func(pow, createCounter);
console.log(powGen()); // 1
console.log(powGen()); // 4
console.log(powGen()); // 9
console.log(powGen()); // 16

При этом я хочу указывать функцию gen с аргументами и при вызове func(). Например так:
function add(a, b) { 
  return a + b; 
}
function square(x) { return x * x; }
var powAdd = func(pow, add);
console.log(powAdd(2, 3)); // 25 = (2 + 3) ^ 2
console.log(powAdd(5, 7)); // 144 = (5 + 7) ^ 2


Я попытался использовать объект arguments, только вышел полный шлак. Попрошу больно не бить и помочь понять, что мною использовалось неправильно/некорректно:

function plus(x) {
  return x + x;
}

function pow(x) {
  return x * x;
}

function fun(a, gen) {
  var arg1 = arguments;
  return function() {
    var arg = arguments;
    var current1 = null;
    for(var i = 0; i < arguments.length;i++)
      current1 = gen(arguments[i]);
    return a(current1);
  };
}

var t = fun(plus, pow);
console.log(t(10));       //200
  • Вопрос задан
  • 457 просмотров
Решения вопроса 1
lazalu68
@lazalu68
Salmon
Вероятно, я не очень понял задачу, но из того что я понял, получилось такое:
Первый вариант
function createCounter(start, step) {
  return function(){
    if (start === undefined)
      start = 0;
    if(step === undefined)
      step = 1;
    start+=step;
    return start - step;
  };
}

function pow(x) {
  return x * x;
}

function generator(f1, f2) {
  return function() {
    return f1(f2());
  };
}

var generatedFunction = generator( pow, createCounter(1, 1) );

generatedFunction(); // 1
generatedFunction(); // 4
generatedFunction(); // 9
generatedFunction(); // 16
generatedFunction(); // 25

Ну, вы бы могли использовать конструктор и тогда даже проблемы переопределения функций не было бы:
Вариант с конструктором
function createCounter(start, step) {
  return function(){
    if (start === undefined)
      start = 0;
    if(step === undefined)
      step = 1;
    start+=step;
    return start - step;
  };
}

function pow(x) {
  return x * x;
}

function CustomIterator(f1, f2) {
  this.f1 = f1;
  this.f2 = f2;
  this.next = function() {
    return this.f1( this.f2() );
  }
}

var iterator = new CustomIterator( pow, createCounter(1,1) )

iterator.next() // 1
iterator.next() // 4

// set some other function as f1
iterator.f1 = function(x) {
  return x * x * x;
}

iterator.next() // 27
iterator.next() // 64

// resetting counter, creating it once again
iterator.f2 = createCounter(1, 5)

iterator.next() // 1
iterator.next() // 216

Но если вы готовы ко всему и у вас всегда с собой баночка вазелина, то как-то так наверное:
Вариант, использующий свойства функции
function createCounter(start, step) {
  return function(){
    if (start === undefined)
      start = 0;
    if(step === undefined)
      step = 1;
    start+=step;
    return start - step;
  };
}

function pow(x) {
  return x * x;
}

function createIterator(f1, f2) {
  function generated() {
    return generated.f1( generated.f2() );
  }
  generated.f1 = f1;
  generated.f2 = f2;
  return generated;
}

iterator = createIterator( pow, createCounter(1,1) );

iterator(); // 1
iterator(); // 4

iterator.f1 = function(x) {
  return x * x * x;
}

iterator(); // 27
iterator(); // 64

Можно конечно переложить на генерируемую функцию обязанности по переопределению функций, но мне кажется это очень-оооочень странным:
Ну вообще содомия
function createCounter(start, step) {
  return function(){
    if (start === undefined)
      start = 0;
    if(step === undefined)
      step = 1;
    start+=step;
    return start - step;
  };
}

function pow(x) {
  return x * x;
}

function createIterator(f1, f2) {
  function generated(inner_f1, inner_f2) {
    if (arguments.length) {
      if (typeof inner_f1 === 'function') {
        generated.f1 = inner_f1;
      }
      if (typeof inner_f2 === 'function') {
        generated.f2 = inner_f2;
      } 
    } else {
      return generated.f1( generated.f2() );
    }
  }
  generated.f1 = f1;
  generated.f2 = f2;
  return generated;
}

iterator = createIterator( pow, createCounter(1,1) );

iterator(); // 1
iterator(); // 4

iterator(function(x) {
  return x * x * x;
});

iterator(); // 27
iterator(); // 64
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
severus256
@severus256
Code everywhere....
Может стоит попробовать использовать глобальную переменную, которую будет менять функция gen при каждом вызове?
Тогда функция f1 будет иметь доступ к каждому новому значению. Если я правильно понял вопрос :D
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы