запустить функцию, имя которой находится в строке

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

Пример:

function myFunction() {
   alert('I am myFunction');
}
function anotherFunction() {
   alert('I am anotherFunction');
}

var func_name = 'myFunction';

$obj = jQuery('a');

$obj.each(function(){
   $(this).func_name(); // eval didn't help here :( 
});

Очевидно, это не сработает, поскольку JS ожидает, что func_name будет допустимой функцией. Есть ли способ запустить myFunction () вместо func_name ()? Спасибо.

ОБНОВЛЕНИЕ: Что ж, после тестирования некоторых ответов кажется, что мое описание проблемы не является полным. : O Я обновил код, включив в него объект, к которому я хочу прикрепить / запустить функцию.

Еще раз спасибо!


person Community    schedule 20.09.2009    source источник
comment
Дуп: stackoverflow.com/questions/496961/   -  person Crescent Fresh    schedule 20.09.2009
comment
Снова дублируйте: stackoverflow.com/questions / 359788 /   -  person Crescent Fresh    schedule 20.09.2009
comment
И снова: stackoverflow.com/questions/912596/   -  person Crescent Fresh    schedule 20.09.2009
comment
И наконец: stackoverflow.com/questions/1144297/   -  person Crescent Fresh    schedule 20.09.2009
comment
Лучшим решением почти наверняка было бы найти способ не указывать имя функции в строке   -  person Gareth    schedule 20.09.2009


Ответы (4)


Нет причин использовать eval. Если ваша функция глобальная, используйте window[func_name]()

С вашим обновленным вопросом:

//the function $ returns an object, thus, this is changed
$(this).func_name();

//to this:
$(this)[func_name]();
person Jani Hartikainen    schedule 20.09.2009
comment
Верно. Но я все равно оставлю свой ответ. На всякий случай не глобально ;-) - person Michael Krelin - hacker; 20.09.2009
comment
Хороший ответ. В JavaScript большинство вещей, которые вы можете делать с помощью оператора точки, вы также можете делать с помощью скобок. поэтому a.foo () и a ['foo'] () делают то же самое. По возможности держитесь подальше от eval (). - person Nosredna; 20.09.2009
comment
Итак, просто чтобы убедиться, что я все правильно понял. «а» - это объект? и 'foo' - это имя функции здесь? Затем мой текущий jQuery (this) .eval (function_name + '()'); становится jQuery (this) [имя_функции] (); правильно? - person ; 20.09.2009
comment
на самом деле я не могу заставить его работать. Кажется, я чего-то упускаю ... но что? Очень признателен, если кто-нибудь может взглянуть на contactsheet.de/sandbox/autoload/index.html по сравнению с contactsheet.de/sandbox/autoload/index2.html (где Я пытаюсь запустить тот же плагин обсуждаемым методом - сразу после предупреждения). Большое спасибо! - person ; 20.09.2009
comment
Насколько я могу судить, проблема заключается в том, что вы не даете функции правильные аргументы. В остальном это выглядит правильно. - person Jani Hartikainen; 20.09.2009

Для методов используйте

obj[func_name]()

Помните, что глобально объявленные функции являются свойствами глобального объекта (т.е. window в браузерах).

Для локальных функций, насколько я знаю, выхода нет

eval(func_name)()
person Christoph    schedule 20.09.2009
comment
Для локальных попробуйте это [func_name] (); - person Nosredna; 20.09.2009
comment
this не совсем местный, он имел в виду (function(){ function A(){}; eval('A')(); })(); - person Michael Krelin - hacker; 20.09.2009

Как уже упоминалось, это делается с помощью операторов доступа к свойствам - «[» и «]». В этом случае важно то, как объявлена ​​эта функция и откуда на нее ссылаются.

Если он объявлен глобально (т. Е. В глобальной области видимости, как объявление функции или выражение функции) или назначен свойству глобального объекта в какой-то момент, то к нему можно получить доступ как к свойству. глобального объекта. В 3-м. редакции ECMAScript-262, можно получить доступ к глобальному объекту с помощью такого выражения, как:

(function(){ return this; })();
// or just `this` when in global scope

(Обратите внимание, что в браузерах глобальный объект обычно является тем же объектом, что и объект, на который ссылается global window, хотя это не обязательно).

Таким образом, вы получите доступ к глобальной функции как:

var globalObj = (function(){ return this; })();
globalObj['your_func'];

// or via `window`
window['your_func'];

Проблема обычно возникает, когда функция объявляется локально, то есть в теле другой функции:

(function(){
  function your_func(){};
  // how to access `your_func` here?
});

Проблема в основном связана с тем, что, хотя можно получить доступ к глобальному объекту (как в предыдущем примере), невозможно получить доступ к объекту переменной функции (т. Е. Объект, используемый в качестве «основы» для переменной и объявление функции в коде функции).

Вы, конечно, можете использовать eval в подобных случаях, но это определенно неправильный подход к проблеме. Намного более простой, более совместимый и эффективный способ выполнения - это прикрепить функцию как свойство некоторого локального объекта:

(function(){
  ...
  function your_func(){}
  var funcs = { your_func: your_func };
  ...
})();

затем используйте те же скобки для доступа к рассматриваемой функции ссылки на свойство:

funcs['your_func'];
person kangax    schedule 20.09.2009

eval(func_name + "()");

Eval возьмет строку и оценит ее во время выполнения.

person David Andres    schedule 20.09.2009
comment
Пояснения, необходимые для удержания баллов. Это верный подход, независимо от вашего личного мнения. - person David Andres; 20.09.2009