【问题标题】:JavaScript ES6 Modules - looking for equivalent to window[functionNameString]()JavaScript ES6 模块 - 寻找等效于 window[functionNameString]()
【发布时间】:2021-10-28 03:28:57
【问题描述】:

我正在将我的 JavaScript 代码转换为 ES6 模块以获得更好的模块化。

我的代码中的一个常见模式是定义一个包含函数名称的字符串: let nextMethodName = "aFunctionName";

然后,稍后,在一个通用事件处理程序中,我将使用以下命令执行该函数: window[nextMethodName]();

现在我正在尝试在模块代码中做同样的事情。

所以,如果我最终要执行的功能是在一个模块中,我将拥有:

import * as myModule from "/JavaScript/myModule.js";

我可以直接执行我的函数: myModule.aFunctionName();

但我似乎无法弄清楚如何做类似的事情 window[myFunctionName]();

myModule 似乎不是窗口中的对象,所以我不能做一些简单的事情: let nextMethodName = "myModule.aFunctionName";

如何将要执行的函数的名称或对该函数的引用传递给我的事件处理程序?这似乎是一个非常简单的问题,但 Google 先生和我没有得到任何有用的地方。

谢谢!

【问题讨论】:

  • 首先,myModule 在这种情况下将 NOT 存在于 window 的模块中 - 这不是 import 所做的 - let nextMethodName = "aFunctionName"; myModule[nextMethodName](); - 更有意义的答案是如果您更详细地展示了您的尝试使用情况,即将发布
  • 你不能把函数称为:window[mModule.myFunctionName]();
  • @Yousaf 不,那行不通。
  • 老实说,我认为应该有一种完全不同的方法来使您的工具可用。这就是模块系统的全部意义所在。
  • @Pointy 如果mModule.myFunctionName 计算为函数名称,例如"foo",那么我希望window[myModule.myFunctionName]() 可以工作。我在这里错过了什么?

标签: javascript ecmascript-6 module es6-modules


【解决方案1】:

我想出的最好方法是使用事件处理程序命名空间中的函数引用。例如:

let nextFunction = myModule.myFunctionName;

在我的事件处理程序中,它可以从模块或依赖于 window[functionName] 的遗留代码调度:

    if (typeof window[nextMethodName] === 'function')
        window[nextMethodName]();
    else 
        if (typeof nextFunction === 'function')
            nextFunction();

【讨论】:

    猜你喜欢
    • 2016-04-22
    • 1970-01-01
    • 2023-03-13
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    相关资源
    最近更新 更多