如何 return 需要 2 个参数和 1 个参数的函数

How to return a function that needs 2 parameters with 1

我相信我已经解决了这个问题,但是只有将 1 个参数传递给我的最终函数才能得到 return 结果。下面是问题

例如,考虑函数 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 的所有函数输入都将是函数 returning 一个小数字,迭代次数将始终是整数。

这是我的回答:

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

这是我试图让其只调用 1 次的函数。上面的一切都正常工作,但我必须能够提交整个响应,只传递一个参数这个函数:

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


console.log(doubleIterator);

您可以使用 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

你也可以用 reducebind:

写同样的东西

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

虽然代码较短,但有点晦涩难懂。它绑定 thisreduce 的第一个参数如下:

  • thisn个元素的空数组,表示回调函数的次数(即第二个参数,见下文)叫做。数组中的实际值并不重要,因为正在使用的回调函数会忽略它们:

  • 回调函数arg => func(arg):在实际调用reduce时将被调用n次(这里还没有发生) ).虽然回调函数可以接受数组值作为第二个参数,但没有兴趣这样做。

第三个参数未绑定,它决定了第一次调用回调函数的初始值。所以 createIterator returns reduce 的变体,它只接受一个参数,即初始值。

请注意,与第一个片段相比有一个无害的区别:如果您调用 createIterator 返回的函数,不带参数,函数 func在这里少调用一次(以 undefined 作为参数,就像在第一个片段中一样);这是因为 reduce 在您未向其传递初始值时的工作方式。