我将此函数调用作为字符串传递:
var dcall = "tumbsNav(1)";
是否可以像SQL中的exec一样动态执行它?
exec(dcall)
答案 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) ;