Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.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_Function_Eval - Fatal编程技术网

Javascript 使用字符串中的参数执行函数

Javascript 使用字符串中的参数执行函数,javascript,function,eval,Javascript,Function,Eval,字符串如下:“foo('argument1','argument2')” 如何在不使用eval的情况下以javascript的形式执行此函数?我知道你可以用 窗口[func](参数) 但是参数是字符串的一部分。我尝试过使用regex,但考虑到javascript没有lookbehind,我不确定如何使用它。有什么建议吗?您可以使用: var s = "foo('argument1','argument2', 5, true)"; var m = s.match(/([^(]+)\(([^)]+)

字符串如下:
“foo('argument1','argument2')”

如何在不使用
eval
的情况下以javascript的形式执行此函数?我知道你可以用

窗口[func](参数)

但是参数是字符串的一部分。我尝试过使用regex,但考虑到javascript没有lookbehind,我不确定如何使用它。有什么建议吗?

您可以使用:

var s = "foo('argument1','argument2', 5, true)";
var m = s.match(/([^(]+)\(([^)]+)\)/);
if (m) {
   var f = window[m[1]];
   var args = m[2].split(',').map(function(v){
     return JSON.parse(v.trim().replace(/^'/,'"').replace(/'$/,'"'))
   });
   f.apply(null,args);
}
(打开控制台)

请注意,这仅适用于基本参数。如果要在不使用eval的情况下处理其他类型的参数,最好定义要处理的类型。

您可以使用以下方法:

var s = "foo('argument1','argument2', 5, true)";
var m = s.match(/([^(]+)\(([^)]+)\)/);
if (m) {
   var f = window[m[1]];
   var args = m[2].split(',').map(function(v){
     return JSON.parse(v.trim().replace(/^'/,'"').replace(/'$/,'"'))
   });
   f.apply(null,args);
}
(打开控制台)


请注意,这仅适用于基本参数。如果您想不使用eval处理其他类型的参数,最好定义要处理的类型。

有几种方法,dystroy已经给出了一种

更简单的方法是:

var args = "foo('argument1','argument2')".split(/[()',]+/).slice(0,-1)
Function.prototype.call.apply(window[args[0]],args)

有几种方法可以做到这一点,dystroy已经给出了一种

更简单的方法是:

var args = "foo('argument1','argument2')".split(/[()',]+/).slice(0,-1)
Function.prototype.call.apply(window[args[0]],args)


你能解释一下你为什么要这么做吗?根据您所说的,
eval
是您唯一的实际选择,但更多信息会有所帮助。有人应该问,这个字符串最初是如何生成的?如果你能将参数转换成数组,你可以使用
window[func].apply(null,args)
@RocketHazmat你注意到你的评论是我答案的一部分了吗?@dystroy:我刚刚做了!:-)你能解释一下你为什么要这么做吗?根据您所说的,
eval
是您唯一的实际选择,但更多信息会有所帮助。有人应该问,这个字符串最初是如何生成的?如果你能将参数转换成数组,你可以使用
window[func].apply(null,args)
@RocketHazmat你注意到你的评论是我答案的一部分了吗?@dystroy:我刚刚做了!:-)如果我的答案有一部分不清楚,请提问,我会解释清楚。这样我就可以拥有一个内联自定义事件(即:
按钮
)。我使用jQuery通知事件触发,但我需要一种方法来执行
onmyevent
属性给出的字符串。如果我的答案有一部分不清楚,请询问,我会解释。很清楚。这样我就可以拥有一个内联自定义事件(即:
按钮
)。我使用jQuery通知事件触发,但我需要一种方法来执行
onmyevent
属性给出的字符串。非常非常好。你知道它短的主要原因是它只处理字符串吗?我喜欢这个。非常非常好。你知道它变短的主要原因是它只处理字符串吗?