【问题标题】:Run function dynamically in es6在 es6 中动态运行函数
【发布时间】:2019-01-10 09:14:22
【问题描述】:

我有一个包含如下功能列表的文件

export function today() {}

export function yesterday() {}

export function tomorrow() {}

export function out(input) { input() }

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

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

【问题讨论】:

  • 创建可能功能的映射并调用possibleMap[input]()
  • 请分享你到目前为止所做的事情。

标签: javascript ecmascript-6 es6-modules


【解决方案1】:

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

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

单次导出

这种方法的好处是您有一个单一的导出,因此您知道您要导出的所有内容。但是,如果文件变大,您必须上下滚动才能查看定义。另外,你正在流血,所以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]();
}

【讨论】:

  • @FarshadFahimi just Google Eval is evil 在做之前。休息由你决定。
【解决方案2】:

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

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() {}

【讨论】:

    【解决方案3】:
    function func_abc() {
        alert("abc");
    }
    function call_others(function_name) {
        if (function_name == "abc") {
            func_abc();
        }
    }
    call_others("abc");
    

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

    【讨论】:

      【解决方案4】:
      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]();
      

      【讨论】:

        猜你喜欢
        • 2021-04-01
        • 1970-01-01
        • 2014-03-15
        • 2012-07-02
        • 2018-05-03
        • 2018-06-05
        • 2021-06-27
        • 2021-08-11
        • 2018-04-05
        相关资源
        最近更新 更多