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

标签 javascript call apply

我相信我已经解决了这个问题,但只将 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();

这是我试图使只有 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

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

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

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

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

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

关于javascript - 如何返回一个需要 2 个参数和 1 个参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40207428/

相关文章:

c++ - 函数调用守卫

c++ - 在没有类实例的情况下调用 C++ 类方法?

python - Pandas:使用方法链修改单元格值

python - 基于索引、列名和原始值映射 Pandas 数据框?

javascript - 使用作用域变量注入(inject) html 时,$scope.$apply 不起作用 - AngularJs

JavaScript && 或 ||

Javascript JSON 动态父级

javascript - VS 代码中的 "Could not find task ' npm '"错误

android - 通话记录器在 android 10 (Q) 中不起作用

python - 使用 nltk 雪球词干分析器将列中的值作为参数传递