Кто-нибудь знает, есть ли он?
Я хочу вызвать функцию, используя имя переменной.
редактировать:
Я написал здесь скрипку с тем, что я пытаюсь сделать:
<div id="some"> ... </div>
ЯШ:
(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 (); });
Если функция определена на глобальном уровне, она автоматически становится дочерним элементом window
.
Поэтому вы всегда можете вызвать window.functionName();
в любом месте, которое вы обычно вызываете functionName();
,
Кроме того, поскольку в Javascript-объектах работают как ассоциативные массивы, вы можете вызывать любой дочерний объект любого объекта с использованием синтаксиса массива следующим образом: object['childName']
. Сюда входят функции, поэтому вы можете сделать object['functionName']();
для любой функции, являющейся членом объекта.
Объединив эти две точки вместе, вы можете вызвать любую глобально определенную функцию, например:
window['functionName']();
И так как functionName
в приведенном выше примере представляет собой строку, вы можете использовать переменную в этих скобках, что означает, что у вас есть те же функциональные возможности, что и call_user_func()
PHP.
[РЕДАКТИРОВАТЬ]
Как я уже сказал, это работает для любого объекта. В комментариях OP указано, что функции, которые он хочет использовать таким образом, находятся в подключаемом модуле JQuery. Поэтому они, вероятно, будут частью объекта JQuery и обычно называются так: JQuery().functionName();
(или с помощью $
вместо JQuery
).
Синтаксис Javascript позволяет нам использовать ['functionName']()
в любом месте, где мы можем использовать .functionName()
, поэтому, принимая приведенный выше пример JQuery, мы могли бы изменить его так, чтобы он выглядел следующим образом:
JQuery()['functionName']();`
Но этот метод может быть адаптирован для любого объекта Javascript. В любом месте, где вы используете .functionName()
, его можно заменить на ['functionName']()
.
var a = function(foo) {console.log(foo);} a.call(null, 'test'); a('test');
Существует немало способов достижения этого. Самый быстрый и способный (и небезопасный!) Способ сделать (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.