我想在变量中调用一个名字的函数。
例如:
我动态获取字符串"pageTracker._trackpageview('/url/page1.page'); "
并将其分配给变量,如下所示
var myFunction = pageTracker._trackpageview('/url/page1.page');";
现在,当我提交页面时,我想执行变量myFunction中的函数。
谢谢大家。
答案 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();
为什么这样?
只需执行eval即可立即运行该功能。如果在被调用函数本身中抛出错误,我们无法区分它与解析中的错误。因此,通过从文本中创建一个函数,我们可以在执行它时将它们分开。
只是使用newFunction = Function(myFunction)不会编译它,因此速度较慢。因此,使用新的Function()返回一个函数(进而创建一个函数)是我们的诀窍。我们也可以这样使用eval,但我更喜欢新功能。
其他人对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')”作为一个字符串,那么就有一些代码闻到这里了。