使用Function()构造函数作为闭包。

3
我想要做类似以下的事情:
function simpleOperations(operation) {
    let myFanction = new Function('a', 'b', 'a ' + operation + ' b');
    return myFanction
}

let sum = simpleOperations("+")
let multiplicate = simpleOperations("*")

console.log("your sum is: " + sum(3,7));
console.log("your product is: " + multiplicate(3,7));

而不是得到:

your sum is: 10
your product is: 21

我看到的是:
your sum is: undefined
your product is: undefined

你有没有关于如何修复它的想法?:)

4
你漏写了return - ASDFGerte
1
可能有用:变量运算符是否可行? - 将您的运算符编码在一个表中,而不是动态构建函数。 - VLAZ
函数体中缺少返回值。 - Manoj Kumar Nagaraj
2个回答

4

函数的文本主体需要 返回 值,否则你的 a + b 或者 a * b 等仅仅是未使用的表达式。

function simpleOperations(operation) {
    let myFanction = new Function('a', 'b', 'return a ' + operation + ' b');
    return myFanction
}

let sum = simpleOperations("+")
let multiplicate = simpleOperations("*")

console.log("your sum is: " + sum(3,7));
console.log("your product is: " + multiplicate(3,7));


3

使用 Function 是一种反模式。它离 eval 只有一步之遥,而且总有更好的方法来编写代码,特别是考虑到 JavaScript 已经支持一级函数。

const add = (a, b) => a + b
const multiply = (a, b) => a * b

console.log("your sum is: " + add(3,7))
console.log("your product is: " + multiply(3,7))

your sum is: 10
your product is: 21

如果您想使用 "+" 和 "*" 字符串访问函数,您可以创建一个简单的查找表,并在不支持特定操作时抛出错误 -

const operations = { 
  "+": (a, b) => a + b,
  "*": (a, b) => a * b 
}
  
function simpleOperations(op) {
  const f = operations[op]
  if (f == null)
    throw Error(`unsupported operation: ${op}`)
  return f
}
  
const add = simpleOperations("+")
const multiply = simpleOperations("*")

console.log("your sum is: " + add(3,7))
console.log("your product is: " + multiply(3,7))

const divide = simpleOperations("/")  // <- not yet implemented

your sum is: 10
your product is: 21
Error: unsupported operation: /

实现一个简单的计算器是学习如何编写第一种程序语言的好方法。如果您对此感兴趣,请参见相关问答


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接