Javascript эквивалент PHP call_user_func()

Кто-нибудь знает, есть ли он?

Я хочу вызвать функцию, используя имя переменной.


Редактирование:

Я написал здесь скрипку с тем, что я пытаюсь сделать:

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

});

Ответ 1

Если функция определена на глобальном уровне, она автоматически становится дочерним элементом объекта window.

Поэтому вы всегда можете вызвать window.functionName(); любое место, которое вы обычно вызываете functionName();.

Кроме того, поскольку в объектах Javascript работают как ассоциативные массивы, вы можете вызывать любой дочерний объект любого объекта с использованием синтаксиса массива следующим образом: object['childName']. Это включает в себя функции, поэтому вы можете сделать object['functionName'](); для любой функции, являющейся членом объекта.

Объединяя эти две точки вместе, вы можете вызвать любую глобально определенную функцию, например:

window['functionName']();

И поскольку functionName в приведенном выше примере представляет собой строку, вы можете использовать переменную в этих скобках, что означает, что у вас есть те же функции, что и PHP call_user_func().

[EDIT]

Как я уже говорил, это работает для любого объекта. Комментарии OP указывают, что функции, которые он хочет использовать таким образом, находятся в подключаемом модуле JQuery. Поэтому они, вероятно, будут частью объекта JQuery и обычно называются так: JQuery().functionName(); (или с $ вместо JQuery).

Синтаксис Javascript позволяет использовать ['functionName']() в любом месте, где мы можем использовать .functionName(), поэтому, взяв пример JQuery, мы могли бы изменить его так:

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

Но этот метод может быть адаптирован для любого объекта Javascript. В любом месте, где вы используете .functionName(), его можно заменить на ['functionName']().

Ответ 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 body), argumentArrayy is the array of arguments you want to pass to function.

Ответ 3

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

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