如何使用存储在变量中的值来调用函数?

时间:2010-10-08 05:16:11

标签: javascript jquery function

我有一个变量

var functionName="giveVote";

我需要做的是,我想调用存储在 var functionName 中的函数。我尝试使用functionName(); 。但它不起作用。请帮忙。

修改基于同样的问题,我有

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

规则是一个预先定义的函数,它接受methodName:,这里我有硬编码的txtInf。但我想在这里提供一个javascript变量,以使我的代码通用。 var methodName =“txtInf”;

这里我想在用于规则函数之前先评估methodName。

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

6 个答案:

答案 0 :(得分:10)

您有一些选项 - 两个基本选项包括window[functionName]()setTimeout(functionName, 0)。给那些人一个机会。

编辑:如果您的变量只是函数的字符串名称,请使用这些;否则,如果您能够实际为变量分配函数引用(例如var foo = function() {};),则可以使用foo()表示法,或foo.apply(this, [])等。

编辑2:要在methodName解雇前评估$(this).rules(),您只需应用上面的第一个语法(使用window对象),如下所示:

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

我认为这就是你所要求的 - 如果没有,请澄清一点,我会很乐意重写一个解决方案。

答案 1 :(得分:7)

   var functionName="giveVote"; 

将字符串“giveVote”分配给变量functionName。 如果giveVote是函数的名称,那么您必须通过以下方式之一分配

如果您在编译时知道函数名称,那么可以

var functionName="giveVote"; 

但我认为您希望动态分配该功能然后调用它。然后你必须说

   var functionName=window["giveVote"]; 

然后通过

调用它
functionName();

或直接

window["giveVote"]();

这是可能的,因为您在JavaScript中声明的任何全局函数(全局函数,而不是任何其他对象的一部分),然后它将成为window对象的一部分。

答案 2 :(得分:2)

根据我的理解,您将函数的名称存储在变量 functionName 中。现在这与保持对函数本身的引用不同。所以,你不能只使用functionName(),因为functionName在这里引用的是String对象,而不是函数。

所以,这就是你需要做的,使用functionName来获取函数对象。如上所述,如果已在窗口范围中定义了该函数,则可以使用window [functionName]。但是根据代码的结构,你很可能将这个函数作为其他对象的一个​​成员,你需要使用该对象来访问该函数。例如,如果变量 objContainingFunction 引用包含具有 functionName 中定义的名称的函数的对象,则可以使用

调用该函数
  

objContainingFunction [functionName]()

关于你的编辑 -

  

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

您的要求到底是什么?因为,正如我前面提到的,methodName是一个字符串。

答案 3 :(得分:1)

为什么不直接将字符串传递给您想要调用函数的位置?为什么先存储它?这似乎更令人困惑,因为它是另一层间接(最终,可能会使您的代码更难调试)。

例如:

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

我认为做你正在做的事情没有特别的优势。

答案 4 :(得分:0)

通常没有充分的理由使用字符串来传递函数引用。如果需要这样做,只需将函数分配给变量即可。由于函数是对象,它实际上就像处理它们一样简单。

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

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

someOtherFunction(giveVote);

在相关的说明中,setTimeout(functionName, 0)仅起作用,因为如果是字符串,setTimeout将eval作为第一个参数。为了性能和安全性问题,最好避免这种情况。

答案 5 :(得分:-1)

我同意Justin提供的解决方案,在这里再添加一个方案。

您甚至可以将回调函数名称存储在某个对象&然后打电话给它。

e.g。

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

callback(); //actual call to the function