Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中动态执行函数_Javascript_Eval_Form Submit - Fatal编程技术网

在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即可立即运行该函数。如果在被调用的函数本身中抛出了错误,我们无法区分这与解析错误之间的区别。所以,通过从文本中创建一个函数,我们可以将解析函数和执行函数分开

  • 仅仅使用newFunction=Function(myFunction)不会编译它,因此速度较慢。因此,使用new Function()返回函数(从而创建函数)是我们的诀窍。我们也可以这样使用eval,但我更喜欢新函数

  • 其他人对eval(和new Function())非常小心的说法是正确的。它可能是恶意脚本的开口

    为什么要这样做

  • 只需执行eval即可立即运行该函数。如果在被调用的函数本身中抛出了错误,我们无法区分这与解析错误之间的区别。所以,通过从文本中创建一个函数,我们可以将解析函数和执行函数分开

  • 仅仅使用newFunction=Function(myFunction)不会编译它,因此速度较慢。因此,使用new Function()返回函数(从而创建函数)是我们的诀窍。我们也可以这样使用eval,但我更喜欢新函数


  • 其他人对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函数的函数由