0

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

var dcall = "tumbsNav(1)";

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

exec(dcall)
4

4 回答 4

3

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

相反,像这样传递函数:

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

然后调用它:

dcall();
于 2012-05-24T00:29:00.910 回答
3

为此,您需要eval(dcall).

eval可以在您的程序中打开可怕的安全漏洞和性能问题。如果你需要使用它,那通常意味着你设计的程序很糟糕。

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

于 2012-05-24T00:32:39.893 回答
1

使用 eval(dcall)。

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

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

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

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

4)范围变得无法预测。

但是,如果您了解所有这些,那么 eval 会很有帮助。

于 2012-05-24T00:43:21.127 回答
1

无论您存储在哪里

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) ;
于 2012-05-24T01:09:28.347 回答