Можете ли вы вызвать функцию, основанную на переменной в js? - PullRequest
0 голосов
/ 03 августа 2011

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

switch(x){
   case "a":
      // call function a
      a():
      break;
   case "b":
      // call function b
      a():
      break;
   case "c":
     // call function c
     c():
     break;
}

Не могу ли я просто сказать

// If the x variable is set, call the corresponding function
 If (x){
  x();
}

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

Ответы [ 4 ]

2 голосов
/ 03 августа 2011

Создайте кеш функций, которые вы хотите вызвать:

var fnCache = {
  a: function(){},
  b: function(){},
  c: function(){}
};

тогда в вашем коде:

  // x is assigned a value somehow
  var x = 'a';

  // ... later ...

  if (typeof fnCache[x] == 'function') {
    fnCache[x]();
  }

Предполагается, что все функции являются нативными, а не хост-методами (см. Комментарий к посту Mrchief).

1 голос
/ 03 августа 2011

Это зависит от того, где определена ваша функция. Если это определено в глобальной области, вы можете сказать: if (window[x]) window[x]();

Если его часть объекта находится в глобальной области видимости, скажите:

var obj = function() {
  this.x = function() {
      // do something
      };
}

тогда вы можете назвать это как:

window[obj][x]();

Это для начала. Вы должны добавить нулевые проверки и действительно ли это функция или нет в вашей последней процедуре.

Если вы используете jQuery, вы можете проверить, сказав: if (jQuery.isFunction(window[x])) window[x]();

0 голосов
/ 03 августа 2011
// If the x variable is set, call the corresponding function
If (x){
   x();
}

но я хочу использовать х в качестве заполнителя для других функций.Возможно ли это?

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

Вы можете сделать что-то вроде:

if (typeof x === 'function'){
   x();
}
0 голосов
/ 03 августа 2011

Вы можете сделать это несколькими способами, но привести пример, аналогичный тому, который вы хотите:

function foo(x)
{
    x();
}

function bar()
{
    alert('test');
}

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