Как вызвать функцию, используя значение, хранящееся в переменной? - PullRequest
6 голосов
/ 08 октября 2010

У меня есть переменная

var functionName="giveVote";

Мне нужно вызвать функцию, хранящуюся в var functionName . Я пытался использовать functionName (); , Но это не работает. Пожалуйста, помогите.

Редактировать Исходя из той же проблемы, у меня есть

$(this).rules("add", {txtInf: "^[a-zA-Z'.\s]{1,40}$" }); 

rules - это предопределенная функция, которая принимает methodName: здесь я жестко закодировал txtInf. Но я хочу предоставить здесь переменную javascript, чтобы сделать мой код универсальным. var methodName = "txtInf";

Здесь я хочу сначала оценить methodName, прежде чем использовать его в функции правил.

$(this).rules("add", {mehtodName: "^[a-zA-Z'.\s]{1,40}$" }); 

Ответы [ 6 ]

10 голосов
/ 08 октября 2010

У вас есть несколько вариантов - два основных включают window[functionName]() или setTimeout(functionName, 0).Дайте им шанс.

Редактировать: если ваша переменная является просто строковым именем функции, используйте их;в противном случае, если вы действительно можете назначить ссылку на функцию переменной (например, var foo = function() {};), вы можете использовать нотацию foo() или foo.apply(this, []) и т. д.

Редактировать 2: Комуоцените methodName на месте до запуска $(this).rules(), вы просто примените первый синтаксис выше (используя объект window), например так:

$(this).rules("add", {window[methodName](): ...});

Я думаю, это то, что выспрашиваю - если нет, пожалуйста, уточните немного больше, и я буду рад переписать решение.

7 голосов
/ 08 октября 2010
   var functionName="giveVote"; 

Назначает строку "giveVote" для переменной functionName. Если giveVote - это имя функции, вам нужно назначить одним из следующих способов:

Если вы знаете имя функции во время компиляции, тогда вы можете

var functionName="giveVote"; 

Но я думаю, что вы хотите динамически назначить функцию и затем вызвать ее. Тогда вы должны сказать

   var functionName=window["giveVote"]; 

, а затем позвоните по номеру

functionName();

Или напрямую

window["giveVote"]();

Это возможно, потому что любая глобальная функция, которую вы объявляете в JavaScript (глобальная, как не являющаяся частью какого-либо другого объекта), становится частью объекта window.

2 голосов
/ 08 октября 2010

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

Итак, вот что вам нужно сделать, используйте functionName, чтобы получить объект функции. Как предложено выше, вы можете использовать window [functionName], если функция была определена в области видимости окна. Но исходя из того, как ваш код структурирован, вы, скорее всего, будете использовать эту функцию как член какого-то другого объекта, и вам нужно будет использовать этот объект для доступа к функции. Например, если переменная objContainedFunction относится к объекту, который содержит функцию с именем, определенным в functionName , то вы можете вызвать функцию, используя

objContainedFunction [functionName] () .

А что касается вашего редактирования -

$ (this) .rules ("add", {имя-метода: "^ [a-zA-Z '. \ S] {1,40} $"});

Что именно здесь требуется? Потому что, как я упоминал ранее, methodName - это строка здесь.

1 голос
/ 08 октября 2010

Почему бы просто не передать строку прямо туда, куда вы хотите вызвать функцию? Зачем хранить его первым? Это кажется более запутанным, так как это еще один уровень косвенности (и, в конечном итоге, может затруднить отладку вашего кода).

Например:

$('.someSelector').click(giveVote);

Я не вижу особого преимущества в том, что вы пытаетесь сделать.

0 голосов
/ 11 апреля 2014

Я согласен с решением, предоставленным Джастином, добавив сюда еще один сценарий.

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

например

var callback =  this.objName.getHandlerName() ; //we get the current function to call from some logic

callback(); //actual call to the function
0 голосов
/ 08 октября 2010

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

var giveVote = function() { ... };

var someOtherFunction = function(callback) {
    callback();
};

someOtherFunction(giveVote);

В связанной заметке setTimeout(functionName, 0) работает только потому, что setTimeout будет eval первым параметром, если это строка. Лучше всего избегать этого из-за проблем с производительностью и безопасностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...