如何返回一个需要2个参数的函数1

时间:2016-10-23 20:20:31

标签: javascript call apply

我相信我已经解决了这个问题,但是只有一个参数传递给我的最终函数才能返回结果。这是问题

例如,考虑函数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);

1 个答案:

答案 0 :(得分: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

您也可以使用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的第一个参数绑定如下:

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

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

第三个参数保持未绑定状态,并确定第一次调用回调函数的初始值。因此createIterator返回reduce的变体,它只接受一个参数,即初始值。

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

相关问题