首页 > 解决方案 > 在 node.js 中访问动态函数名

问题描述

我有一个导出函数的 js 文件myFunction。然后,我在导出模块之外定义了另一个函数。如何通过名称动态访问它?

我正在尝试这种方式,但它不起作用:

exports.myFunction = () => {
    let functionName = 'helperFunction';
    global[functionName]();
}

const helperFunction = () => {
    console.log('helperFunction invoked');
}

我正在尝试使用全局范围global[functionName]();,但不起作用。辅助函数的范围是什么?

helperFunction之所以在export之外,是因为我在同一个文件中导出了多个调用helperFunction的函数。

标签: javascriptnode.jsexport

解决方案


TLDR:使用eval

你好呀,

我告诉你一件关于吊装的事情,然后回答你的问题。

现在您已经在导出后定义了helperFunction,它可能会因为称为提升的 JS 行为而导致问题。在myFunction中识别了helperFunction的声明,但在初始化时不识别。这会给你以下错误:

ReferenceError: Cannot access 'helperFunction' before initialization

因此,只需将helperFunction移至文件顶部即可。

现在,到实际的答案。您可能已经意识到您的helperFunction实际上在范围内,您可以调用它。为此,您需要评估字符串:helperFunction()。您可以使用以下代码段:

console.log('hi');
let functionName = 'helperFunction';
eval(`${functionName}()`);
console.log('bye');

奖励:您实际上对代码所做的是创建一个包含一个字符串元素的数组并调用该数组。当然,这会引发以下错误:

TypeError: [functionName] is not a function

推荐阅读