18

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

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

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

var func = eval(funcStr);

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

func();

调用该函数并显示警报。

但是,在其他浏览器中并非如此。没啥事儿。

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

4

11 回答 11

33

这个怎么样?

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'
于 2009-08-13T12:01:09.853 回答
15

IE 无法eval运行(可能是出于安全原因)。

最好的解决方法是将函数放在一个数组中,如下所示:

var func = eval('[' + funcStr + ']')[0];
于 2009-08-13T12:08:03.443 回答
8

我意识到这是旧的,但它是我谷歌搜索评估匿名 javascript 函数字符串时出现的唯一有效结果。

我终于从 jquery google group 上的帖子中弄清楚了如何做到这一点。

eval("false||"+data)

其中 data 是您的函数字符串,例如“function() { return 123; }”

到目前为止,我只在 IE8 和 FF8(我个人计算机上的浏览器)中尝试过这个,但我相信 jquery 在内部使用它,所以它应该可以在任何地方工作。

于 2011-11-13T23:36:41.143 回答
6

尝试

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

eval(funcStr);

func();
于 2009-08-13T11:57:23.390 回答
4

像这样使用评估:

var func = eval('(' + funcStr + ')');
于 2009-08-13T11:58:09.643 回答
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();

是jsfiddle

于 2014-11-13T20:40:39.270 回答
1

这也可以。

var func = eval("_="+funcStr);
于 2019-01-26T16:20:15.700 回答
0

同样有效的是

var myFunc = function(myParam){
   // function body here
}
于 2009-08-13T19:39:49.027 回答
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);
于 2012-03-01T01:43:53.713 回答
0

一个简单的例子,将函数定义为字符串,eval()对其进行 ing,并在立即调用函数时传入参数(然后将结果转储到控制台):

console.log('eval: %s', eval("(function(foo) { return foo.bar; })")({"bar": "12345"}));

这会产生如下输出。

eval: 12345

于 2013-07-02T00:49:48.267 回答
-1

function-serialization-tools提供了一个函数 s2f(),它采用函数的字符串表示形式并将其作为函数返回。

于 2015-12-29T20:53:50.367 回答