#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();