调用名称存储在变量中的函数

Call a function whose name is stored in a variable

本文关键字:函数 变量 存储 调用      更新时间:2023-09-26

我有以下脚本:

(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种方法:

  • 通过将函数附加到窗口对象,但它不会是局部的并且处于关闭状态,并且我无法访问其他局部变量
  • eval,在我看来是最好的选择,但它仍然是eval,所以我不想使用它
  • 这个,但它是另一种架构,我不想改变它

我该如何解决这个问题?

要调用函数,请使用

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

替换:

var init = function () {
    var str = 'fctToCall';
    Module.str(); // here
};

带有:

var init = function () {
    var str = 'fctToCall';
    Module[str](); // here
};

这里,str被用作访问Module上的fctToCall功能的密钥。

然后,您可以在IIFE:中致电Module2.init()

(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`.
})();

由于JS中的所有内容都是对象,因此可以使用对象表示法。

Module[str]();

您可以调用如下函数:

Module[str]();