使用jQuery执行动态传递的函数调用

时间:2012-05-24 00:27:27

标签: javascript jquery

我将此函数调用作为字符串传递:

var dcall = "tumbsNav(1)";

是否可以像SQL中的exec一样动态执行它?

exec(dcall)

4 个答案:

答案 0 :(得分:3)

eval是等价的,但你不应该使用它。

相反,传递这样的函数:

var dcall = function() {tumbsNav(1);};

然后用:

调用它
dcall();

答案 1 :(得分:3)

要执行此操作,您需要eval(dcall)

eval可以在您的计划中打开terribly security holes and performance issues 。如果你需要使用它,这通常意味着你设计的程序很差。

相反,您可以保留对要调用的函数的引用并保存一组参数并使用apply,例如tumbsNav.apply(null, [1]);。我不知道你的代码,所以这是我能提供的最通用的解决方案。

答案 2 :(得分:1)

使用eval(dcall)。

正如其他人所说,eval被认为是不好的做法。主要原因是

1)使用不当可能会使您的代码容易受到注入攻击。

2)维护代码变得更加困难(没有行号,不能使用调试工具)

3)执行速度更慢(浏览器无法编译)

4)范围变得无法预测。

但是,如果您了解所有这些,那么eval会非常有用。

答案 3 :(得分:1)

无论您在哪里存储

var dcall = "tumbsNav(1)";

您可以改为存储

var dcall = function() {
   return tumbsNav(1);
};

无论你在哪里打电话,而不是打电话

eval(dcall);

您可以改为呼叫

dcall();

唯一不起作用的情况是,在调用tumbsNav时未定义var func = ...。然后你必须存储字符串。如果字符串完全在你的控制之下,那么就没有安全漏洞,但要注意@Porco提到的所有问题

正如Kolink所提到的,如果在使用调用tumbs的包装匿名函数分配tumbsNav时未定义{I},则我的示例不会导致问题。如果示例如下,则上述评论才有意义:

var dcall = tumbsNav, darg = 1;
// later in the code, you can call
dcall(darg) ;