如何 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
你也可以用 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
returns reduce
的变体,它只接受一个参数,即初始值。
请注意,与第一个片段相比有一个无害的区别:如果您调用 createIterator
返回的函数,不带参数,函数 func在这里少调用一次(以 undefined
作为参数,就像在第一个片段中一样);这是因为 reduce
在您未向其传递初始值时的工作方式。
我相信我已经解决了这个问题,但是只有将 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
你也可以用 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
returns reduce
的变体,它只接受一个参数,即初始值。
请注意,与第一个片段相比有一个无害的区别:如果您调用 createIterator
返回的函数,不带参数,函数 func在这里少调用一次(以 undefined
作为参数,就像在第一个片段中一样);这是因为 reduce
在您未向其传递初始值时的工作方式。