javascript - 动态构建函数

标签 javascript ecmascript-6

是否可以根据另一个函数参数动态构建一个函数?

例如:

基本功能:

const someFunction = (functionName, functionParams) => {
  // Function Built here
};

someFunction("colorFunction", ["red", true]);

我希望它构建类似的东西: 我需要将数组解构为单独的参数,但我不确定这有多简单?我不知道如何使用第一个字符串来调用函数名称?

functionName(...functionParams);

在我的脑海中,它会像这样工作:

const colorFunction = (color, bool) => {
  console.log("Colour: " + color);
  console.log("Bool: " + bool);
};

对此有点困惑 - 我觉得我距离不到一百万英里,但我不确定!任何帮助都会很棒,谢谢!!

编辑 - 为什么?

我有一个带有点击事件的 react 组件,该事件会触发 redux 操作。理想情况下,此操作会将一些内容发送到我的 reducer ,并异步调用此“动态”函数。我可以通过大量 if/else 来完成此操作,但如果可以通过这种方式构建函数,我认为这不是实现此目的的非常干净的方法。

最佳答案

首先您需要确定要动态调用的函数的存储位置。如果它们是全局函数,那么您可以使用 window 调用它们:

const someFunction = (functionName, functionParams) => {
    window[functionName]();
};

如果它们是对象的方法,那么您可以使用该对象执行类似的操作:

const someFunction = (functionName, functionParams) => {
    myObject[functionName]();
};

至于如何传递参数,这里有几个选择。如果您正在运行最新版本的 JS,或者使用 polyfill,那么您确实可以使用展开运算符:

const someFunction = (functionName, functionParams) => {
    window[functionName](...functionParams);
};

否则您始终可以信赖 apply方法:

const someFunction = (functionName, functionParams) => {
    window[functionName].apply(null, functionParams);
};

apply 方法中的第一个参数是您希望传递给函数的上下文,在您的情况下,它似乎没有必要,因此为 null 值。

编辑:如 Bergi 提到的那样,使用 apply 更正了 bind

关于javascript - 动态构建函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57271786/

相关文章:

javascript - Aurelia 停止 http 请求过载

javascript - 在 JavaScript 中合并多个相同长度的对象数组

javascript - Youtube API 在 Node.js Express 中使用异步来处理多个相关请求

javascript - 设置可变长度二维数组

javascript - 如何在 ECMAScript 5 中拥有 block 作用域

javascript - 箭头函数 vs 胖箭头函数

javascript - Promise 模式 - 使用 Promise.all()

javascript - ES6 - 警告 : setState(…): Cannot update during an existing state transition

javascript - http拦截器( typescript )上的Angularjs + strictdi错误

javascript - 查找左括号的结束括号,但右括号完全匹配