我相信我已经解决了这个问题,但只将 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
您也可以使用 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
虽然代码较短,但有点晦涩难懂。它绑定(bind) this
和 reduce
的第一个参数,如下所示:
this
:n 元素的空数组,指示调用回调函数(即第二个参数,见下文)的次数。数组中的实际值并不重要,因为正在使用的回调函数会忽略它们:回调函数
arg => func(arg)
:当实际调用reduce
时将被调用 n 次(这这里还没有发生)。尽管回调函数可以接受数组值作为第二个参数,但没有兴趣这样做。
第三个参数未绑定(bind),它决定了第一次调用回调函数的初始值。所以 createIterator
返回 reduce
的变体,它只接受一个参数,即初始值。
请注意,与第一个片段相比,有一个无害的区别:如果您调用由 createIterator
返回的函数,不带参数,则调用函数 func这里少了一次(以 undefined
作为参数,就像在第一个片段中一样);这是因为 reduce
在您未向其传递初始值时的工作方式。
关于javascript - 如何返回一个需要 2 个参数和 1 个参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40207428/