【问题标题】:dynamic call to a function jQuery动态调用函数jQuery
【发布时间】:2015-04-04 07:21:38
【问题描述】:

我正在尝试构建一个库,我需要根据我在这样的参数中的变量动态调用函数

strategies = min
function dispatchRuleToStrategy(strategies)
{
    $.each(strategies, function(index, value) {
        strategy = "strategy_" + value;
    });
}

function strategy_min()
{
    // do something
}

如何从dispatchRuleToStrategy() 调用函数strategy_min()

我一直在尝试几件事,但都没有奏效。

感谢您的帮助

【问题讨论】:

    标签: javascript jquery function dynamic call


    【解决方案1】:

    我终于找到了真正的问题。我在一个准备好的 jquery 文档中,这是一个闭包。在今天之前我不知道关闭是什么。

    感谢大家的帮助

    【讨论】:

      【解决方案2】:

      其他人已经建议为函数创建一个包装对象,但是,如果您的 strategy_min() 函数在全局范围内,您可以直接访问它:

      window['strategy_' + value]();
      

      window 在浏览器中指的是全局对象。括号表示法用于访问其键是动态生成的属性。这样您就可以访问作为全局对象属性的函数,即window,并使用括号调用它。

      【讨论】:

      • 不应该真正鼓励使用全局命名空间,如果你依赖它来实现这一点,你就不能轻易地重构你的代码来停止使用它
      【解决方案3】:

      您可以通过以下方式使用 eval() 函数

       $.each(strategies, function(index, value) {
          strategy = "strategy_" + value;
          eval(strategy+"()");
      });
      

      【讨论】:

      • eval 通常应该是不得已的方法。请参阅 this question 等。
      • eval 是个糟糕的选择。
      • 有一天你会发现一个用户通过'my_evil_code(),function(){}'
      【解决方案4】:

      将它们放在一个对象中并使用属性名称:

      var strategy_table = {
          min: function() {
              // do something
          },
          max: function() {
              // do something else
          },
          ...
      };
      

      然后您可以通过strategy_table[value] 访问它们:

      $.each(strategies, function(index, value) {
          strategy_table[value]();
      });
      

      【讨论】:

        【解决方案5】:

        使用 Object 创建函数字典,例如lib

        var lib = {
            'strategy_min': strategy_min
        };
        

        然后你可以通过这个字典中的键调用Object

        lib['strategy_min']();
        

        如果您已经命名了所有函数并且不想一遍又一遍地重新输入名称,您可以

        var lib = {};
        function addToLib(fn) {
            lib[fn.name] = fn;
        }
        // then
        addToLib(strategy_min);
        // or
        [strategy_min].forEach(addToLib);
        

        【讨论】:

        • 嗨,我一直试图让它工作一个多小时,但事实并非如此。第一个对所有内容都进行了硬编码,但是当我尝试以第二种方式进行操作时,它不起作用。这是我所做的function dispatchRuleToStrategy(strategies) { console.log(strategies); var lib = {}; function addToLib(fn) { lib[fn.name] = fn; } $.each(strategies, function(index, value) { addToLib("strategy_" + value); }); } function strategy_min() { console.log("ok min"); } function strategy_required() { console.log("ok required"); }
        • 我已经弄清楚了问题所在。 addToLib() 不能接受字符串,我只有一个字符串。我怎样才能绕过这个问题?
        • @khalidsookia 是的,addToLib 需要一个 function 它是一种将 function 添加为 lib 的属性的方法,其中名称属性的名称是函数的名称;我向您展示了在我的第二个代码块中构造lib Object 的替代方法,调用方法将像以前一样保持lib['strategy_min']();。使用addToLib 的优点只是您不必以相同的方式对您的lib Object 进行硬编码,从而更容易在未来进行更新或更改。
        猜你喜欢
        • 2011-10-26
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多