调用仅以函数名称作为字符串的函数(ES6语法)

时间:2019-03-13 02:46:10

标签: javascript ecmascript-6 const

我正在做一个奇怪的事情,我得到一个函数的名称,并使用该名称调用该函数,如下所示:

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问题。谢谢!

1 个答案:

答案 0 :(得分:1)

只有eval才有可能使用,不应使用它:

eval(myFuncName + '()');

相反,请更改代码,以便将函数放置在 object 上(即使它不是窗口),然后使用普通括号表示法查找属性值(就像您在与window(除了fns之外)进行操作,然后调用检索到的函数:

const fns = {
  myFunc() {
    console.log('do something');
  }
};
const myFuncName = 'myFunc';
fns[myFuncName]();

如果您想更加模仿对象上的属性const,请使用Object.defineProperty通过configurable: false确保函数属性不能被删除或重新分配:< / p>

'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';