定义一个接受一组运算符作为输入的工厂函数

问题描述 投票:0回答:2

我一直在使用客户端 JavaScript 开发一个简单的计算器应用程序,并实现了基本数学运算的程序逻辑

+, -, x, /
。该代码作为回调函数实现,因此可以在事件处理程序中使用。

   add = (a , b) => a + b
   subtract = (a , b) => a - b
   multiply = (a, b) => a * b
   divide = (a, b) => a / b

我读到工厂函数在每个函数的结构相似的情况下非常有用。但是我不确定如何创建要映射的工厂函数是运算符。就像是,

createOperation("add")
将返回
(a , b) => a + b
createOperation("subtract")
将返回
(a, b) => a - b
等等

我的第一个想法是将所有内容转换为字符串,连接它们,然后使用 eval 返回。像

eval("(example) => example.output")
之类的东西。根据我在 MDN 文档和其他地方读到的内容,强烈建议不要这样做。

有没有一种方法可以在不诉诸

eval
hack的情况下实现这一目标?

javascript function operators factory
2个回答
0
投票
function createOperation(operator, { a, b }) {
  switch (operator) {
    case "add":
      return a + b;
    case "substract":
      return a - b;

    // .... implement for mul and div operator

    default:
      throw new Error("please provide correct operator");
  }
}

const result = createOperation("substract", { a: 3, b: 5 });
console.log(result);

0
投票

使用映射和工厂函数可以如下所示。您还可以使用

enum
来保存操作名称

const mapping = {
  mul: (a, b) => a * b,
  add: (a, b) => a + b
};

const factory = (action) => {
  if (mapping.hasOwnProperty(action)) {
    return mapping[action];
  }
  throw new Error("Action does not exist");
};

const add = factory("add");
console.log(add(1, 2));

在此示例中,我们有

mapping
变量,它将操作键映射到相应的功能。
factory
函数从此
mapping
变量检索每个操作并返回它。找不到钥匙 - 通常不允许,因此会抛出
Error

您可以使用

Map
代替对象,如果键可以是字符串类型以外的类型,则特别有用。

© www.soinside.com 2019 - 2024. All rights reserved.