在JavaScript中动态执行函数

时间:2010-08-13 23:19:44

标签: javascript eval form-submit

我想在变量中调用一个名字的函数。

例如:
我动态获取字符串"pageTracker._trackpageview('/url/page1.page'); "并将其分配给变量,如下所示

var myFunction = pageTracker._trackpageview('/url/page1.page');";

现在,当我提交页面时,我想执行变量myFunction中的函数。

谢谢大家。

6 个答案:

答案 0 :(得分:3)

function functionFromString(funcDef) {
   try {
      return (new Function("return function() {" + funcDef + "};"))();
   } catch (e) {
      alert(e);
      return (function() {});
   }
}

var myFunction = "pageTracker._trackpageview('/url/page1.page');";

var realFunction = functionFromString(myFunction);
realFunction();

为什么这样?

  1. 只需执行eval即可立即运行该功能。如果在被调用函数本身中抛出错误,我们无法区分它与解析中的错误。因此,通过从文本中创建一个函数,我们可以在执行它时将它们分开。

  2. 只是使用newFunction = Function(myFunction)不会编译它,因此速度较慢。因此,使用新的Function()返回一个函数(进而创建一个函数)是我们的诀窍。我们也可以这样使用eval,但我更喜欢新功能。

  3. 其他人对eval(以及新的Function())非常小心的说法是正确的。它可能是恶意脚本的开头。

答案 1 :(得分:1)

您可以使用JavaScript eval()功能执行此操作。注意控制传递给eval()的值,因为它将执行给定的任何字符串。

eval("pageTracker._trackpageview('/url/page1.page');");

答案 2 :(得分:1)

您不仅仅是尝试执行一个名为“”的函数,而是一个带有接收器,方法名和文字字符串参数的复杂代码行。执行任意代码段的唯一方法是使用eval(),但eval()是危险的。如果您不是非常小心,有人可以将恶意代码传递给您将在eval()调用中执行的脚本。

答案 3 :(得分:0)

您可以在javascript中使用eval ..

var myFunction = "pageTracker._trackpageview('/url/page1.page');";
//...
eval(myFunction);

答案 4 :(得分:0)

解决方案:包装功能

//define:
var myFunction = function (){pageTracker._trackpageview('/url/page1.page');}

//call:
myFunction();


完整示例:

<html>
   <head>
      <script type="text/javascript">
         var foo = function (){alert('bar');}
      </script>
   </head>
   <body onload="foo();"> </body>
</html>

答案 5 :(得分:0)

但是这样,您无法检查参数是否正确,或者对其进行编码等。而且出于某些原因我避免使用eval。

我更喜欢更难但更安全的方式 - 如果它是一个字符串,它可以被解析:

//test dub
pageTracker = {
   _trackpageview: function(path) {alert(path)}
}

var str = "pageTracker._trackpageview('/url/page1.page')";

//get param
var urlpathregex = /\('([a-z0-9\-._~%!$&'()*+,;=:@\/]+)'\)/;
var param = urlpathregex.exec(str)[1];

//do some stuff/validation with param
[...]

//get object and function name
var funcregex = /([a-zA-Z0-9_]+)?\.?([a-zA-Z0-9_]+)(?=\()/;
var match = funcregex.exec(str);
var obj, func;
obj = match[1];
func = match[2];

//invoke
window[obj][func](param);

这只是一个例子,而不是复制和粘贴准备好的代码:)因为要开始 - 如果你动态地将“pageTracker._trackpageview('/ url / page1.page')”作为一个字符串,那么就有一些代码闻到这里了。