javascript相当于PHP的call_user_func()

时间:2011-04-28 12:05:43

标签: php javascript jquery function

有人知道是否有吗?

我想使用变量名调用函数。

<小时/> 编辑:

我在这里发布了一个小提琴我想要做的事情:

http://jsfiddle.net/sAzPA/

<div id="some">
  ...
</div>

JS:

(function($){
  $.fn.MyPlugin = function(){

    return this.each(function(){
       var somefunction = function(arg1, arg2){ alert(arg1); },
           someotherfunction = function(arg1, arg2){ alert(arg2); },
           reallyimportantfunction = function(arg1, arg2){
            var foo = $(this).attr('id') + 'function';

            // here I want to call the function with the foo value as name, and pass it arg1 and arg2

            $()[foo](arg1, arg2); // <- doesn't work

           };

       reallyimportantfunction();
    });
  };  
})(jQuery);


jQuery(function($){
  $('#some').MyPlugin ();

});

3 个答案:

答案 0 :(得分:18)

如果在全局级别定义了一个函数,那么它将自动成为window对象的子级。

因此,您可以随时拨打window.functionName();通常只能拨打functionName();的地方。

此外,由于Javascript对象的工作方式与关联数组类似,因此可以使用如下所示的数组语法调用任何对象的任何子对象:object['childName']。这包括函数,因此您可以对作为对象成员的任何函数执行object['functionName']();

将这两点组合在一起,您可以调用任何全局定义的函数,如下所示:

window['functionName']();

由于上面示例中的functionName是一个字符串,您可以在这些括号中使用变量,这意味着您具有与PHP call_user_func()相同的功能。

[编辑]

正如我所说,这适用于任何物体。 OP的评论声明他想要以这种方式使用的函数是在JQuery插件中。因此,它们可能是JQuery对象的一部分,通常会这样调用:JQuery().functionName();(或使用$代替JQuery)。

Javascript语法允许我们在任何可以使用['functionName']()的地方使用.functionName(),因此,采用上面的JQuery示例,我们可以将其更改为:

JQuery()['functionName']();`

但是这种技术可以适用于任何Javascript对象。您使用.functionName()的任何地方都可以将其替换为['functionName']()

答案 1 :(得分:2)

有很多方法可以实现这一目标。最快和最脏(和不安全!)的方法是做(PS:以下示例中的fnName是存储为字符串的函数的名称)

eval(fnName)

但是你也可以

            this[fnName]();//careful with "this" though. Try replacing with "window" if it doesnt work for you

或通过传递参数来调用它

this[fnName].apply(contextObject,argumentArray) //contextObject will be objest which will be referenced by the keyword "this" within the function body (fnName's body), argumentArrayy is the array of arguments you want to pass to function.

答案 2 :(得分:1)

var a = function(foo) {console.log(foo);}

a.call(null, 'test');
a('test');