我相信我已经解决了这个问题,但是只有一个参数传递给我的最终函数才能返回结果。这是问题
例如,考虑函数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 :(得分: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
: n 元素的空数组,它指示调用回调函数(即第二个参数,见下文)的次数。数组中的实际值并不重要,因为使用的回调函数会忽略它们:
回调函数arg => func(arg)
:实际调用reduce
时将调用 n 次(此处尚未发生)。虽然回调函数可以接受数组值作为第二个参数,但是没有兴趣这样做。
第三个参数保持未绑定状态,并确定第一次调用回调函数的初始值。因此createIterator
返回reduce
的变体,它只接受一个参数,即初始值。
请注意,与第一个片段相比,存在一个无害的区别:如果您调用函数,即createIterator
返回的函数,不带参数,则函数 func 被调用一次这里(以undefined
为参数,就像在第一个片段中一样);这是因为reduce
在没有传递初始值时会如何工作。