Вызов функции, начинающейся только с имени функции в виде строки (синтаксис ES6) - PullRequest
3 голосов
/ 13 марта 2019

Я делаю странную вещь, когда получаю имя функции и вызываю функцию с таким именем, например:

function myFunc(){
    //do somethng
};
var myFuncName = 'myFunc';
window[myFuncName](); // Expected result.

... что работает, но теперь я определил функцию, используя ES6 const naming, window[myFuncName] не определено:

const myFunc = () => {
    //do somethng
};
var myFuncName = 'myFunc';
window[myFuncName](); // window[myFuncName] is not a function.

Кто-нибудь знает, как вызвать функцию ES6, когда у вас есть только ее имя в виде строки? Я работаю в веб-расширении браузера, но думаю, что это общая проблема JavaScript. Спасибо!

1 Ответ

1 голос
/ 13 марта 2019

Это было бы возможно только с 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';
...