2 回答
![?](http://img1.sycdn.imooc.com/54585094000184e602200220-100-100.jpg)
TA贡献1854条经验 获得超8个赞
首先,您需要确定要动态调用的函数的存储位置。如果它们是全局函数,那么您可以使用window以下方法调用它们:
const someFunction = (functionName, functionParams) => {
window[functionName]();
};
如果它们是对象的方法,那么您可以使用该对象执行类似的操作:
const someFunction = (functionName, functionParams) => {
myObject[functionName]();
};
至于如何传递参数,这里有几个选项。如果您正在运行最新版本的 JS,或者使用 polyfills,那么您确实可以使用扩展运算符:
const someFunction = (functionName, functionParams) => {
window[functionName](...functionParams);
};
否则,您始终可以依靠apply方法:
const someFunction = (functionName, functionParams) => {
window[functionName].apply(null, functionParams);
};
apply 方法中的第一个参数是您希望传递给函数的上下文,在您的情况下,它似乎没有必要,因此是null值。
编辑:如Bergi所提bind及的apply那样更正
![?](http://img1.sycdn.imooc.com/5c4aa098000126bb09600960-100-100.jpg)
TA贡献1797条经验 获得超4个赞
您正在寻找的是Function#bind为了制作一个thunk - 基本上是一个不带参数的函数,它用于延迟计算。
使用.bind您可以对函数进行部分应用。在您的情况下,您只需应用所有参数,并只在最后留下执行步骤:
//your function
const colorFunction = (color, bool) => {
console.log("Colour: " + color);
console.log("Bool: " + bool);
};
//partially apply all argument to it
const thunk = colorFunction.bind(null, "red", true);
//this can now be passed around and executed at a later point
setTimeout(thunk, 3000);
console.log("wait 3 seconds");
由于函数是JavaScript中的第一类成员,因此您可以通过这种方式传递任何函数。如果你真的需要一个将其他人变成 thunk 的函数,那么你可以很容易地做到这一点:
const toThunk = (func, args) => func.bind(null, ...args);
哪个是你的,someFunction但为了更清楚起见,只重新命名了名称和参数。
添加回答
举报