Подтвердить что ты не робот

Вызвать функцию, имя которой хранится в переменной

У меня есть следующий 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, поэтому я не хочу его использовать.
  • но это другая архитектура, я не хочу ее менять.

Как я могу это решить?

4b9b3361

Ответ 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]();