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

问题描述 投票:3回答:1

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

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

javascript ecmascript-6 const
1个回答
1
投票

它只能用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';
© www.soinside.com 2019 - 2024. All rights reserved.