你能用js中的变量调用函数吗?

时间:2011-08-03 01:31:00

标签: javascript function variables

我有一个很长的绕组开关案例声明,如此

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();
}

它不工作的唯一原因是因为它认为im调用函数x(),但我想用x作为其他函数的占位符。这可能吗?

4 个答案:

答案 0 :(得分:2)

创建您要调用的函数的缓存:

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 :(得分:1)

这取决于您的功能定义的位置。如果它在全球范围内定义,您可以说: if (window[x]) window[x]();

如果它是全局范围内的对象的一部分,请说:

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

然后你可以这样称呼它:

window[obj][x]();

这是为了让你入门。您应该在最终例程中添加空检查以及它是否真的是一个函数。

如果您使用jQuery,可以查看:if (jQuery.isFunction(window[x])) window[x]();

答案 2 :(得分:0)

您可以通过多种方式进行此操作,但为您提供类似于您想要的示例:

function foo(x)
{
    x();
}

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

foo(bar);

答案 3 :(得分:0)

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

但我想使用x作为其他功能的占位符。这可能吗?

不,x在两种情况下都是变量。 x()不是函数名,它是函数调用,其中x是变量而()是实际调用。函数变量和其他变量都存储在同一个全局命名空间中,并且会相互覆盖,因此您不能使用同名的两个版本。您必须将其存储在对象中或将其称为其他内容。

您可以执行以下操作:

if (typeof x === 'function'){
   x();
}