Вызвать функцию, имя которой хранится в переменной
У меня есть следующий script:
(function () {
var Module = (function () {
var fctToCall = function () {
alert('Foo');
};
return {
fctToCall: fctToCall
};
})();
var Module2 = (function () {
var init = function () {
var str = 'fctToCall';
Module.str(); // here
};
return {
init: init
};
})();
})();
Итак, я хочу назвать этот метод fctToCall
своим именем - как я могу это сделать? До сих пор я знаю 3 метода:
- привязывая функцию к объекту window, но тогда она не будет локальной и закрывающейся, и у меня не будет доступа к другим локальным переменным
- eval, лучшие варианты, насколько я вижу, но он все равно eval, поэтому я не хочу его использовать.
- но это другая архитектура, я не хочу ее менять.
Как я могу это решить?
Ответы
Ответ 1
Для использования функции вызова
Module[str]();
Поскольку Module
- это объект, вы можете получить доступ к динамическим свойствам и его методам с помощью скобки нотации.
(function() {
var Module = (function() {
var fctToCall = function() {
console.log('Foo');
};
return {
fctToCall: fctToCall
};
})();
var Module2 = (function() {
var init = function() {
var str = 'fctToCall';
// Call as
Module[str]();
};
return {
init: init
};
})();
Module2.init();
})();
Ответ 2
Заменить:
var init = function () {
var str = 'fctToCall';
Module.str(); // here
};
С
var init = function () {
var str = 'fctToCall';
Module[str](); // here
};
Здесь str
используется как ключ для доступа к функции fctToCall
на Module
.
Затем вы можете позвонить Module2.init()
в IIFE:
(function() {
var Module = (function() {
var fctToCall = function() {
document.write('Foo'); // (alert is broken in snippets)
};
return {
fctToCall: fctToCall
};
})();
var Module2 = (function() {
var init = function() {
var str = 'fctToCall';
Module[str](); // Access & call `fctToCall`.
};
return {
init: init
};
})();
Module2.init(); // Call `init`.
})();
Ответ 3
Так как все в JS является объектом, вы можете использовать нотацию объекта.
Module[str]();
Ответ 4
Вы можете просто вызвать функцию следующим образом:
Module[str]();