我将此函数调用作为字符串传递:
var dcall = "tumbsNav(1)";
是否可以像 SQL 中的 exec 一样动态执行它?
exec(dcall)
我将此函数调用作为字符串传递:
var dcall = "tumbsNav(1)";
是否可以像 SQL 中的 exec 一样动态执行它?
exec(dcall)
eval
是等价的,但你不应该使用它。
相反,像这样传递函数:
var dcall = function() {tumbsNav(1);};
然后调用它:
dcall();
为此,您需要eval(dcall)
.
eval
可以在您的程序中打开可怕的安全漏洞和性能问题。如果你需要使用它,那通常意味着你设计的程序很糟糕。
相反,您可以保留对要调用的函数的引用并保存参数数组并使用apply
,例如tumbsNav.apply(null, [1]);
. 我不知道你的代码,所以这是我能提供的最通用的解决方案。
使用 eval(dcall)。
正如其他人所提到的, eval 被认为是不好的做法。主要原因是
1) 不当使用会使您的代码容易受到注入攻击。
2)维护代码变得更加困难(没有行号,不能使用调试工具)
3) 执行更慢(浏览器无法编译)
4)范围变得无法预测。
但是,如果您了解所有这些,那么 eval 会很有帮助。
无论您存储在哪里
var dcall = "tumbsNav(1)";
您可以改为存储
var dcall = function() {
return tumbsNav(1);
};
无论你在哪里打电话,而不是打电话
eval(dcall);
您可以改为致电
dcall();
唯一不起作用的情况是如果在调用tumbsNav
时未定义。var func = ...
然后你必须存储字符串。如果字符串完全在您的控制之下,则没有安全漏洞,但请注意@Porco 提到的所有问题
tumbsNav
正如 Kolink 所提到的,如果在使用调用 tumbs 的包装匿名函数分配它时未定义我的示例,则不会导致问题。上面的评论只有在示例如下时才有意义:
var dcall = tumbsNav, darg = 1;
// later in the code, you can call
dcall(darg) ;