Javascript动态函数调用名称

时间:2013-03-04 13:42:12

标签: javascript jquery

所以我有以下伪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个函数。我怎么能这样做?!

在这个related StackOverflow question中,答案提供了如何在窗口范围内完成此解决方案的解决方案,即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);

如果您希望将这三个函数动态调用私有,这可能会更好。

3 个答案:

答案 0 :(得分:2)

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

function meth_4()
{
    this["meth_1"]();
    this["meth_2"]();
    this["meth_3"]();
}

答案 1 :(得分: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')

答案 2 :(得分: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.keyobj["key"]在某些情况下只能使用后者。例如。如果属性被调用property name,则您无法执行obj.property name但可以执行obj["property name"]