我正在做一个奇怪的事情,我得到一个函数的名称,并用该名称调用函数,如下所示:
function myFunc(){
//do somethng
};
var myFuncName = 'myFunc';
window[myFuncName](); // Expected result.
...有效,但现在我使用ES6 const
命名定义了func,window[myFuncName]
未定义:
const myFunc = () => {
//do somethng
};
var myFuncName = 'myFunc';
window[myFuncName](); // window[myFuncName] is not a function.
当你只有它的名字作为字符串时,有谁知道如何调用ES6函数?我正在使用浏览器Web扩展,但认为这是一个普遍的JavaScript问题。谢谢!
它只能用eval
,不应该使用:
eval(myFuncName + '()');
相反,更改你的代码,以便将函数放到一个对象上(即使它不是窗口),然后使用普通括号表示法来查找属性值(就像你正在使用window
一样,除了用fns
代替),并调用检索到的函数:
const fns = {
myFunc() {
console.log('do something');
}
};
const myFuncName = 'myFunc';
fns[myFuncName]();
如果你想更密切地模仿const
作为对象的属性,使用Object.defineProperty
来确保函数属性不能删除也不能重新分配,通过configurable: false
:
'use strict';
const fns = {};
Object.defineProperty(fns, 'myFunc', {
configurable: false,
value: () => {
console.log('do something');
}
});
const myFuncName = 'myFunc';
fns[myFuncName]();
// can't reassign property:
fns.myFunc = 'foo';