我的javascript编程课程中的一个作业有问题。
分配:
创建一个名为“calculate”的函数,该函数需要三个函数作为参数,并在调用时返回其中一个函数作为结果。
每次打电话
let result = calculate(add, subtract, multiply)(1,3)
它应该返回不同的结果。
我尝试过不同的方法并得到不同的错误,例如计算不是函数或乘法未定义。
这是我到目前为止所尝试的:
function add(num1, num2){
return num1 + num2;
}
function subtract(num1, num2){
return num1 - num2;
}
function multiply(num1, num2){
return num1 * num2;
}
function calculate(add, subtract, multiply){
let randNum = Math.floor(Math.random() * 3) + 1
switch(randNum){
case 1:
let add = add(num1, num2)
break;
case 2:
let subtract = subtract(num1, num2);
break;
case 3:
let multiply = multiply(num1, num2);
break;
}
}
let result = calculate(add(2,4), subtract(2,4), multiply(2,4))
console.log(result);
我做了一些关于currying的研究,但我看不出我的错误。任何帮助将不胜感激。
您可以从参数中获取随机函数,并将此函数返回给具有参数的另一个调用。
const
add = (a, b) => a + b,
subtract = (a, b) => a - b,
multiply = (a, b) => a * b,
calculate = (...args) => args[Math.floor(Math.random() * args.length)];
let result = calculate(add, subtract, multiply)(1, 3);
console.log(result);
这不是教授currying的一个很好的例子。我认为教练/课程试图在这里遇到的是当你这样做时:
let result = calculate(add, subtract, multiply)(1,3)
你正在调用一个函数(calculate
),它返回一个函数(你传递它的三个函数中的一个,我猜是随机选择虽然赋值不明确),然后你调用那个函数(通过使用(1,3)
结果calculate(...)
电话。
calculate
可以是一个单行:
function calculate(...fns) {
return fns[Math.floor(Math.random() * fns.length)];
}
或者在ES5中:
function calculate() {
return arguments[Math.floor(Math.random() * arguments.length)];
}
实例:
function add(num1, num2){
return num1 + num2;
}
function subtract(num1, num2){
return num1 - num2;
}
function multiply(num1, num2){
return num1 * num2;
}
function calculate(...fns) {
return fns[Math.floor(Math.random() * fns.length)];
}
let result = calculate(add, subtract, multiply)(1,3);
console.log(result);
教授currying的一个更有用的例子是:
let result = calculate(add, subtract, multiply)(1)(3);
// ----------------------------------------------^^
请注意,我们用calculate
调用1
的结果,然后用3
调用结果。然后,calculate
需要在另一个收集1
的函数中包装它所选择的函数,然后等待用3
调用:
function calculate(...fns) {
const fn = fns[Math.floor(Math.random() * fns.length)];
return (a) => {
return (b) => {
return fn(a, b);
};
};
}
或更简洁,但不太清楚:
function calculate(...fns) {
const fn = fns[Math.floor(Math.random() * fns.length)];
return (a) => (b) => fn(a, b);
}
实例:
function add(num1, num2){
return num1 + num2;
}
function subtract(num1, num2){
return num1 - num2;
}
function multiply(num1, num2){
return num1 * num2;
}
function calculate(...fns) {
const fn = fns[Math.floor(Math.random() * fns.length)];
return (a) => (b) => fn(a, b);
}
let result = calculate(add, subtract, multiply)(1)(3);
console.log(result);
calculate
返回的函数在被调用时会记住a
并返回一个新函数;该函数在被调用时获取b
并调用fn(a, b)
来获得结果。
该示例预先选择该功能,但它也可以在最后选择它:
function calculate(...fns) {
return (a) => (b) => fns[Math.floor(Math.random() * fns.length)](a, b);
}
实例:
function add(num1, num2){
return num1 + num2;
}
function subtract(num1, num2){
return num1 - num2;
}
function multiply(num1, num2){
return num1 * num2;
}
function calculate(...fns) {
return (a) => (b) => fns[Math.floor(Math.random() * fns.length)](a, b);
}
let result = calculate(add, subtract, multiply)(1)(3);
console.log(result);
calculate应返回其中一个函数,因此应使用实际参数调用calculate函数的结果:
function add(num1, num2){
return num1 + num2;
}
function subtract(num1, num2){
return num1 - num2;
}
function multiply(num1, num2){
return num1 * num2;
}
function calculate(add, subtract, multiply){
let randNum = Math.floor(Math.random() * 3) + 1
switch(randNum){
case 1:
return add
break;
case 2:
return subtract
break;
case 3:
return multiply
break;
}
}
console.log(calculate(add, subtract, multiply)(2, 4));
在calculate
函数中,这部分代码有两个问题:
switch(randNum){
case 1:
let add = add(num1, num2)
break;
case 2:
let subtract = subtract(num1, num2);
break;
case 3:
let multiply = multiply(num1, num2);
break;
add(num1, num2)
)。这将返回一个数字,但预期的行为是它将返回一个函数,以便您可以使用其他参数调用它:
let result = calculate(add, subtract, multiply)(1,3)
calculate
函数没有返回任何值。因此,当你做let result = calculate(...)
时,结果总是未定义的。而不是这个,你的calculate
函数应该返回一个函数:
function calculate(add, subtract, multiply){
let randNum = Math.floor(Math.random() * 3) + 1;
switch(randNum){
case 1:
return add;
case 2:
return subtract;
case 3:
return multiply;
}
}
但是:ぁzxswい
注意区别:你的函数https://jsbin.com/jiholifife/edit?js,console现在返回一个函数。
这是可能的,因为JavaScript中的函数是calculate
对象:函数可以作为参数传递给其他函数,可以由另一个函数返回,并可以作为值赋值给变量。