Модули JavaScript ES6 — ищем эквивалент window[functionNameString]()

#javascript #ecmascript-6 #module #es6-modules

Вопрос:

Я конвертирую свой код JavaScript в модули ES6 для лучшей модульности.

Распространенным шаблоном в моем коде является определение строки, содержащей имя функции: let nextMethodName = "aFunctionName";

Затем, некоторое время спустя, в общем обработчике событий я выполню эту функцию с помощью: window[nextMethodName]();

Теперь я пытаюсь сделать то же самое внутри кода модуля.

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

import * as myModule from "/JavaScript/myModule.js";

Я могу выполнять свою функцию напрямую: myModule.aFunctionName();

но я, похоже, не могу понять, как сделать что-то подобное window[myFunctionName]();

MyModule не кажется объектом в окне, поэтому я не могу сделать что-то такое простое, как: let nextMethodName = "myModule.aFunctionName";

Как я могу передать имя выполняемой функции или ссылку на эту функцию своему обработчику событий? Казалось бы, это очень простой вопрос, но мы с мистером Гуглом не получили ничего полезного.

Спасибо!

Комментарии:

1. во — первых, myModule в этом случае не window будет существовать в модуле — это не то, что делает импорт let nextMethodName = "aFunctionName"; myModule[nextMethodName](); — более содержательный ответ будет получен, если вы покажете свою попытку использования более подробно

2. Не могли бы вы вызвать функцию следующим образом: window[mModule.myFunctionName](); ?

3. @Yousaf нет, это не сработает.

4. Честно говоря, я думаю, что должен быть совершенно другой подход к предоставлению ваших инструментов. В этом весь смысл модульной системы.

5. @Pointy если mModule.myFunctionName , например , вычисляется имя функции "foo" , то я ожидал window[myModule.myFunctionName]() бы, что это сработает. Что я здесь упускаю?

Ответ №1:

Лучшее, что я придумал, — это использовать функциональную ссылку, которая находится в пространстве имен обработчика событий. Например:

let nextFunction = myModule.myFunctionName;

и в моем обработчике событий, который может быть отправлен либо из модулей, либо из устаревшего кода, который полагается на window[Имя функции]:

     if (typeof window[nextMethodName] === 'function')
        window[nextMethodName]();
    else 
        if (typeof nextFunction === 'function')
            nextFunction();