JavaScript-эквивалент PHP call_user_func () - PullRequest
5 голосов
/ 28 апреля 2011

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

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


edit:

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

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 ]

18 голосов
/ 28 апреля 2011

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

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

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

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

window['functionName']();

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

[EDIT]

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

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

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

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

2 голосов
/ 28 апреля 2011

Есть несколько способов достичь этого. Самый быстрый и грязный (и небезопасный!) Способ - это сделать (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.
1 голос
/ 28 апреля 2011
var a = function(foo) {console.log(foo);}

a.call(null, 'test');
a('test');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...