执行使用JavaScript eval()创建的匿名函数

时间:2009-08-13 11:53:41

标签: javascript eval

我有一个函数及其内容为字符串。

var funcStr = "function() { alert('hello'); }";

现在,我执行一个eval()来实际在变量中获取该函数。

var func = eval(funcStr);

如果我没记错的话,在Chrome和Opera中,只需拨打

即可
func();

调用该功能并显示警告。

但是,在其他浏览器中并非如此。什么也没发生。

我不想争论哪种方法是正确的,但我该怎么做呢?我希望能够调用variable();执行存储在该变量中的函数。

11 个答案:

答案 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(),它接受函数的字符串表示并将其作为函数返回。