运行 在 es6 中动态运行

Run function dynamically in es6

我有一个包含如下函数列表的文件

export function today() {}

export function yesterday() {}

export function tomorrow() {}

export function out(input) { input() }

input 是函数的名称,它可以是 tomorrowtodayyesterday 函数之一。

我只需要动态调用todayyesterdaytomorrow函数。

function func_abc() {
    alert("abc");
}
function call_others(function_name) {
    if (function_name == "abc") {
        func_abc();
    }
}
call_others("abc");

您可以这样做或使用 switch 语句

function func_abc() {
    alert("abc");
}
function call_others(function_name) {
    if (function_name == "abc") {
        func_abc();
    }
}
call_others("abc");

您可以这样做或使用 switch 语句

还有一种技巧是将此类函数存储在变量中,然后通过从模块对象属性访问它们来调用它们。示例:

var x = { }; 
x.f1 = function()
{
    console.log('Call me as a string!');
}

现在,您可以使用字符串中的值调用它:

var funcstr = "f1";
x[funcstr]();

你基本上有两个选择。使用映射进行查找或将引用的函数移动到另一个文件并从那里进行通配符导入。 (本质上是一样的)

1。通过查找

const lookup = {today, yesterday, tomorrow}
export function today() {}
export function yesterday() {}
export function tomorrow() {}
export function out(input) { lookup[input]() }

2。将您的代码拆分为两个文件。 index.jsfns.js
index.mjs

import * as lookup from './fns'
export function out(input) { lookup[input]() }  

fns.mjs

export function today() {}
export function yesterday() {}
export function tomorrow() {}

如评论所述,您必须创建一个地图并使用它来调用函数。

您可以尝试以下方法之一:

单一导出

这种方法的好处是您只有一次导出,因此您知道要导出的内容。但是,如果文件变大,则必须上下滚动才能查看定义。另外,你正在流血,所以 out(...) 可以调用任何函数,所以没有必要单独导出它们

function today() {}
function yesterday() {}
function tomorrow() {}
function out(input) {
  module[input]();
}

var module = {
  today, yesterday, tomorrow, out
}

export module;

可能的功能图

这是更值得推荐的方法。这里有一张可能采取的行动的地图。因此,您也在限制可能的输入。这也将使您能够为操作和功能使用更有意义的名称。缺点是必须维护一个列表。因此,对于每个新操作,您都必须更新此列表

export function today() {}
export function yesterday() {}
export function tomorrow() {}

const actionMap = {
  TODAY: today,
  YESTERDAY: yesterday,
  TOMORROW: tomorrow
}

export function out(input) {
  actionMap[input]();
}