【问题标题】:Define a factory function that accepts a set of operators as inputs定义一个接受一组操作符作为输入的工厂函数
【发布时间】:2021-12-30 08:54:50
【问题描述】:

我一直在使用客户端 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 + bcreateOperation("subtract") 将返回 (a, b) => a - b 等等。

我的第一个想法是将所有内容转换为字符串,将它们连接起来,然后使用 eval 返回。像eval("(example) => example.output") 这样的东西。从我在 MDN 文档和其他地方读到的内容来看,这是非常不鼓励的。

有没有办法在不诉诸eval hack 的情况下实现这一目标?

【问题讨论】:

    标签: javascript function operators factory


    【解决方案1】:

    使用映射和工厂函数可能看起来像这样。您还可以使用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,而不是对象,如果键可以不是字符串类型,则特别有用。

    【讨论】:

    • 谢谢,这就是我要找的!
    【解决方案2】:
    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);
    

    【讨论】:

    • 我想返回一个函数而不是操作的结果。
    猜你喜欢
    • 2020-06-25
    • 1970-01-01
    • 2022-01-15
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    相关资源
    最近更新 更多