我一直在使用客户端 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的情况下实现这一目标?
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);
使用映射和工厂函数可以如下所示。您还可以使用
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
代替对象,如果键可以是字符串类型以外的类型,则特别有用。