2016-10-23 7 views
1

Я считаю, что я решил эту проблему, но имею проблему, передающую только один параметр моей конечной функции для возврата результата. Вот вопросКак вернуть функцию, которая нуждается в 2 параметрах с 1

Например, рассмотрим функцию getDouble. Когда вы запускаете дважды значение 3, вы получаете 12, как показано ниже.

getDouble(3) => 6 
getDouble(6) => 12 

Назовем новую функцию createIterator, и мы должны быть в состоянии получить тот же результат, используя createIterator, как показано ниже:

var doubleIterator = createIterator(getDouble, 2); // This means, it runs *getDouble* twice 
doubleIterator(3) => 12 

Для простоты все функциональные входы createIterator будет функции, возвращающие небольшое число, и количество итераций всегда будут целыми числами.

Вот мой ответ:

function getDouble(num){ 
    newNum = num * 2 
    return newNum 
} 


var createIterator = function (func, n) { 
    var results = []; 
    var result; 
    result = func; 
    results.push(func); 

    for(var i = 0;i < n - 1; i++){ 
     results.push(results[i] * 2); 
    } 

    return results; 

}; 

// var doubleIterator = createIterator(getDouble(3),2).slice(-1).pop(); 

Вот функция, что я пытаюсь сделать, чтобы иметь только один вызов. Все работает правильно выше, но я должен быть в состоянии представить весь этот ответ только проходящее один параметр эту функцию:

function doubleIterator(d){ 
    // var n; 
    // createIterator.call(this,n) 
    return createIterator(getDouble(d),n).slice(-1).pop(); 
} 


console.log(doubleIterator); 
+0

вы можете использовать apply вместо вызова, так как apply принимает массив как его параметр – Geeky

ответ

2

Вы могли бы использовать это определение createIterator:

function createIterator(func, n) { 
 
    return function (arg) { 
 
     for (var i = 0; i < n; i++) arg = func(arg); 
 
     return arg; 
 
    }; 
 
} 
 

 
function getDouble(num){ 
 
    return num * 2; 
 
} 
 

 
var doubleIterator = createIterator(getDouble, 2); 
 

 
console.log(doubleIterator(3)); // => 12

Вы также можете написать то же самое с reduce и bind:

function createIterator(func, n) { 
 
    return [].reduce.bind([...Array(n)], arg => func(arg)); 
 
} 
 

 
function getDouble(num){ 
 
    return num * 2; 
 
} 
 

 
var doubleIterator = createIterator(getDouble, 2); 
 

 
console.log(doubleIterator(3)); // => 12

Хотя короткий код, это немного неясным. Он связывает this и первый аргумент reduce следующим образом:

  • this: пустой массив п элементов, который диктует, сколько раз функция обратного вызова (т.е. второй аргумент, смотри ниже) называется. Фактические значения в массиве не важны, так как функция обратного вызова используется их игнорирует:

  • функция обратного вызова arg => func(arg): будет называться п раз, когда reduce фактически вызывается (не произойдет еще здесь). Хотя функция обратного вызова может принимать значение массива в качестве второго аргумента, для этого нет никакого интереса.

Третий аргумент остается несвязанным и определяет начальное значение, с которым функция обратного вызова будет вызываться в первый раз. Таким образом, createIterator возвращает вариант reduce, который принимает только один аргумент, который является начальным значением.

Обратите внимание, что есть одна безвредны разница по сравнению с первым фрагментом: если вы вызываете функцию, которая возвращает createIterator без аргумента, функция функ называется один раз здесь меньше (с undefined в качестве аргумента, просто как в первом фрагменте); это из-за того, как reduce работает, когда вы не передаете ему начальное значение.

+0

Вызов этого многократного раза, вероятно, не очень хорошая идея. Также вы создаете глобальный 'newNum' –

+0

@PaulS. обратитесь к * this *? Что касается глобального * newNum * - это был код OP. Я удалил это сейчас. – trincot

+1

'doubleIterator'; первый вызов принесет 'n' в' -1', будущий цикл invocations к отрицательной бесконечности –

 Смежные вопросы

  • Нет связанных вопросов^_^