在JavaScript中动态执行函数
我想调用一个变量中有其名称的函数 例如:在JavaScript中动态执行函数,javascript,eval,form-submit,Javascript,Eval,Form Submit,我想调用一个变量中有其名称的函数 例如: 我动态获取字符串“pageTracker._trackpageview('/url/page1.page');”,并将其分配给一个变量,如下所示 var myFunction = pageTracker._trackpageview('/url/page1.page');"; 现在,当我提交页面时,我想执行变量myFunction中的函数 谢谢大家。您可以在javascript中使用 var myFunction = "pageTracker._tra
我动态获取字符串
“pageTracker._trackpageview('/url/page1.page');”
,并将其分配给一个变量,如下所示
var myFunction = pageTracker._trackpageview('/url/page1.page');";
现在,当我提交页面时,我想执行变量myFunction中的函数
谢谢大家。您可以在javascript中使用
var myFunction = "pageTracker._trackpageview('/url/page1.page');";
//...
eval(myFunction);
您可以在javascript中使用
var myFunction = "pageTracker._trackpageview('/url/page1.page');";
//...
eval(myFunction);
您可以使用JavaScript函数实现这一点。只需小心控制传递给eval()的值,因为它将执行给定的任何字符串
eval("pageTracker._trackpageview('/url/page1.page');");
您可以使用JavaScript函数实现这一点。只需小心控制传递给eval()的值,因为它将执行给定的任何字符串
eval("pageTracker._trackpageview('/url/page1.page');");
您并不是简单地尝试执行一个名称为的函数,而是一行复杂的代码,其中包含一个接收者、一个方法名和一个文本字符串参数。执行任意代码片段的唯一方法是使用
eval()
,但是eval()
是危险的。如果您不十分小心,可能会有人将恶意代码传递给您的脚本,该脚本将在eval()
调用中执行。您不仅仅是试图执行一个名称为的函数,而是一行复杂的代码,其中包含一个接收器、一个方法名和一个文本字符串参数。执行任意代码片段的唯一方法是使用eval()
,但是eval()
是危险的。如果您不十分小心,可能会有人将恶意代码传递给脚本,脚本将在eval()
调用中执行。解决方案:包装函数
//define:
var myFunction = function (){pageTracker._trackpageview('/url/page1.page');}
//call:
myFunction();
完整示例:
var foo=函数(){alert('bar');}
解决方案:包装函数
//define:
var myFunction = function (){pageTracker._trackpageview('/url/page1.page');}
//call:
myFunction();
完整示例:
var foo=函数(){alert('bar');}
为什么要这样做
其他人对eval(和new Function())非常小心的说法是正确的。它可能是恶意脚本的开口。但这样,您就无法检查参数是否为正确的url,或者对其进行编码。由于已知的原因,我尽量避免评估 我更喜欢更难但更安全的方法-如果它是字符串,则可以对其进行解析:
//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.\u trackpageview('/url/page1.page')”作为字符串,这里已经有一些代码味道。但这样,您就无法检查参数是否是正确的url,或者对其进行编码。由于已知的原因,我尽量避免评估 我更喜欢更难但更安全的方法-如果它是字符串,则可以对其进行解析:
//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.\u trackpageview('/url/page1.page')”作为字符串,这里已经有一些代码味道了。我想在“=”后面有一个引号我正在处理的页面有一个html dropdownlist,一旦更改dropdownlist,pagetacker的一个新值被分配给变量“myfunction”。在提交时,我正在进行验证,如果验证成功,我需要执行pagetracker功能。我假设在“=”后面有一个引号,我正在处理的页面有一个html dropdownlist,一旦更改dropdownlist,pagetacker的一个新值将分配给变量“myfunction”。提交时,我正在进行验证,如果验证成功,我需要执行pagetracker功能。可能像我一样误读了这个问题。这假设页面跟踪器字符串已经设置,或者是可能性列表的一部分,并且不是真正动态的。这个例子当时不起作用。这必须用致命的评估来完成。@fleces:你是对的,我可能不得不删除这个,但原始问题只有一个引号,没有显示字符串,提问者说,
现在当我提交页面时,我想执行变量myFunction中的函数。
这使得我们似乎理解正确。可能像我一样误读了这个问题。这假设页面跟踪器字符串已经设置,或者是可能性列表的一部分,并且不是真正动态的。这个例子当时不起作用。这必须用致命的评估来完成。@fleces:你是对的,我可能不得不删除这个,但原始问题只有一个引号,没有显示字符串,提问者说,现在当我提交页面时,我想执行变量myFunction中的函数。
这使我们看起来理解正确。谢谢您的回复。传递给eval函数的函数由