запустить функцию, имя которой в строке - PullRequest
0 голосов
/ 20 сентября 2009

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

Пример:

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 Я обновил код, включив в него объект, к которому я хочу, чтобы функция была присоединена / запущена.

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

Ответы [ 4 ]

7 голосов
/ 20 сентября 2009

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

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

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

//to this:
$(this)[func_name]();
2 голосов
/ 20 сентября 2009

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

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

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

(Обратите внимание, что в браузерах глобальный объект обычно является тем же объектом, на который ссылается глобальный 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'];
2 голосов
/ 20 сентября 2009

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

obj[func_name]()

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

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

eval(func_name)()
0 голосов
/ 20 сентября 2009
eval(func_name + "()");

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

...