我有一个函数及其内容为字符串。
var funcStr = "function() { alert('hello'); }";
现在,我执行一个eval()来实际在变量中获取该函数。
var func = eval(funcStr);
如果我没记错的话,在Chrome和Opera中,只需拨打
即可func();
调用该功能并显示警告。
但是,在其他浏览器中并非如此。什么也没发生。
我不想争论哪种方法是正确的,但我该怎么做呢?我希望能够调用variable();执行存储在该变量中的函数。
答案 0 :(得分:32)
这个怎么样?
var func = new Function('alert("hello");');
为函数添加参数:
var func = new Function('what', 'alert("hello " + what);');
func('world'); // hello world
请注意,函数是对象,可以按原样分配给任何变量:
var func = function () { alert('hello'); };
var otherFunc = func;
func = 'funky!';
function executeSomething(something) {
something();
}
executeSomething(otherFunc); // Alerts 'hello'
答案 1 :(得分:14)
IE无法eval
功能(大概出于安全原因)。
最好的解决方法是将函数放在一个数组中,如下所示:
var func = eval('[' + funcStr + ']')[0];
答案 2 :(得分:8)
我意识到这已经过时了,但这是我谷歌搜索中用于评估匿名javascript函数字符串的唯一有效结果。
我终于想出了如何从jquery google群组的帖子中做到这一点。
eval("false||"+data)
其中data是你的函数字符串,如“function(){return 123;}”
到目前为止,我只在IE8和FF8(个人计算机上的浏览器)中尝试过这个,但我相信jquery在内部使用它,因此它应该适用于所有地方。
答案 3 :(得分:6)
尝试
var funcStr = "var func = function() { alert('hello'); }";
eval(funcStr);
func();
答案 4 :(得分:4)
像这样使用eval:
var func = eval('(' + funcStr + ')');
答案 5 :(得分:3)
我们通过准备将字符串转换为真正的JavaScript函数的通用函数解析器来解决这个问题:
if (typeof String.prototype.parseFunction != 'function') {
String.prototype.parseFunction = function () {
var funcReg = /function *\(([^()]*)\)[ \n\t]*{(.*)}/gmi;
var match = funcReg.exec(this.replace(/\n/g, ' '));
if(match) {
return new Function(match[1].split(','), match[2]);
}
return null;
};
}
用法示例:
var func = 'function (a, b) { return a + b; }'.parseFunction();
alert(func(3,4));
func = 'function (a, b) { alert("Hello from function initiated from string!"); }'.parseFunction();
func();
here是jsfiddle
答案 6 :(得分:1)
也可以。
var func = eval("_="+funcStr);
答案 7 :(得分:0)
什么也有效
var myFunc = function(myParam){
// function body here
}
答案 8 :(得分:0)
EVAL没有eval()......
function evalEx(code){
var result,D=document,S=D.createElement('script'),
H=D.head||D.getElementsByTagName['head'][0],
param=Array.prototype.slice.call(arguments);
code='function evalWE(){'+code+'}';
S.innerText===''?S.innerText=code:S.textContent=code;
H.appendChild(S);
result=evalWE.apply(this,param);
H.removeChild(S);
return result
}
用法示例:
ABC=evalEx('return "ABC"');
nine=evalEx('return arguments[1]+arguments[2]',4,5);
答案 9 :(得分:0)
将函数定义为字符串,eval()
并在立即调用函数时传入参数(然后将结果转储到控制台)的简单示例:
console.log('eval: %s', eval("(function(foo) { return foo.bar; })")({"bar": "12345"}));
这会产生如下输出。
eval: 12345
答案 10 :(得分:-1)
function-serialization-tools提供了一个函数s2f(),它接受函数的字符串表示并将其作为函数返回。