2

所以我有以下伪Javascript代码:

var Class = (function(window, document, $) {
    function meth_1()
    {
        //some code
    }

    function meth_2()
    {
        //some code
    }

    function meth_3()
    {
        //some code
    }

    function meth_4()
    {
        //some code to call other three functions dynamically
    }

    Class = {
        meth_1: meth_1,
        meth_2: meth_2,
        meth_3: meth_3,
        meth_4: meth_4
    };
    return Class;

})(window, document, jQuery);

meth_4函数中,我想通过将函数名作为字符串传递来动态调用其他 3 个函数。我怎样才能做到这一点?!

在这个相关的 StackOverflow 问题中,答案提供了如何在窗口范围内完成此操作的解决方案,即window[function_name]()。但是,我想知道如何在我的特定情况下做到这一点。

谢谢。

编辑

我选择的答案可以。您还可以执行以下操作:

var Class = (function(window, document, $) {
    var meth_func = {
        meth_1: function(){/**your code**/},
        meth_2: function(){/**your code**/},
        meth_3: function(){/**your code**/}            
    }

    function meth_4(func_name)
    {
        meth_func[func_name]();
    }

    Class = {
        meth_4: meth_4
    };
    return Class;

})(window, document, jQuery);

如果您想将动态调用的这三个函数设为私有,这可能会更好。

4

3 回答 3

2

由于您想在对象范围而不是窗口范围内使用方括号表示法调用函数,因此您可以使用this代替window

function meth_4()
{
    this["meth_1"]();
    this["meth_2"]();
    this["meth_3"]();
}
于 2013-03-04T13:44:45.813 回答
0

我不知道你为什么想要那个('Class' 作为变量名也不好),但可以这样做:

var Class = (function (window /*, ... */) {
  return {
    func1: function () {console.log('1')}
  , func2: function () {console.log('2')}
  , func3: function () {console.log('3')}
  , func4: function (funcName) {
      console.log('4+')
      this[funcName]()
    }
  }
})(window)

Class.func4('func3')
于 2013-03-04T13:51:29.703 回答
0

这是一个可以做你想做的事情的实现。如果您传递一个字符串,它将简单地查找适当的函数并执行它。但是,由于 JS 中的函数确实是它们自己的对象,因此您可以将它们传递给周围,并表明与您所要求的相比,我已经扩展了一些功能。如果您传递一个函数(实际上是字符串以外的任何内容),它将(尝试)调用它

meth_4 = function(fun){
   if(typeof fun === 'string'){
       this[fun](args.slice(1));
   } else { //assuming it's a function
       if(arguments.length == 1)
          fun.call(this,[])
       } else {
          fun.apply(this,arguments.slice(1))  
       }
   }
}

JavaScript 对象是或可以被视为键/值对集合。任何函数或属性都可以通过两种语义等效的方式访问

obj.key或者obj["key"]在某些情况下只能使用后者。例如,如果属性被调用property name,你不能做obj.property name但可以做obj["property name"]

于 2013-03-04T13:51:55.490 回答