我正在使用使用eval函数的Javascript代码。
eval(myString)
myString = myFunc(arg)的值,我想直接调用myFunc而不使用eval。
我没有对要调用的函数的任何控制,因为我将该函数作为String(此处为myString)。 该函数的参数也是同一个字符串的一部分。
那么,有没有办法可以在不使用eval的情况下调用预期的函数?
答案 0 :(得分:2)
我对允许用户提供函数名称有点怀疑,但是......假设你在变量中有函数名,在变量中有arg的值。悬臂:
var myString = window[fn](arg);
arg
可能已经在争论中了,所以这很简单。下一部分是扩展函数名称。只是一点正则表达式:
var fn = /^([a-z0-9_]+)\(arg\)$/i.exec(str)[1];
if (fn && typeof window[fn] === 'function') {
window[fn](arg);
}
这当然假设该函数始终在全局范围内,但如果不是,则应该能够相应地进行调整。另外,我的正则表达式是我想出的第一件事。它可能没有涵盖所有可能的函数名称。
如果你想将字符串限制为一组特定的函数(你几乎肯定应该这样),那么一旦你有了函数名,这就变得非常容易了:
var allowedFunctions = {fn1: fn1, fn2: fn2, someOtherFunction: function() {} },
fn = /^([a-z0-9_]+)\(arg\)$/i.exec(str)[1];
if (fn && allowedFunctions[fn]) {
allowedFunctions[fn](arg);
} else {
// Hah, nice try.
}
(如果arg
实际上不是变量名,而是某种文字或可能是任意表达式,这会变得更复杂,更不安全。)
答案 1 :(得分:0)
除了使用eval之外,JavaScript不提供任何调用表示为字符串的函数的方法。但是,使用它并没有错。鉴于你没有其他选择。
答案 2 :(得分:0)
您可以尝试使用Function
:
var sure = function(s) {
return confirm(s);
};
var str = 'sure("Are you sure?")';
var rtn = new Function('return ' + str)();
alert(rtn);