Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.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 eval()创建的匿名函数_Javascript_Eval - Fatal编程技术网

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

执行使用JavaScript eval()创建的匿名函数,javascript,eval,Javascript,Eval,我有一个函数,它的内容是字符串 var funcStr = "function() { alert('hello'); }"; 现在,我做一个eval()来实际获取变量中的函数 var func = eval(funcStr); 如果我没记错的话,在Chrome和Opera中,只需呼叫 func(); 调用该函数并显示警报 但是,在其他浏览器中,情况并非如此。什么也没发生 我不想争论哪种方法是正确的,但我怎么能做到这一点呢?我希望能够调用variable();执行存储在该变量中的函数。尝试

我有一个函数,它的内容是字符串

var funcStr = "function() { alert('hello'); }";
现在,我做一个eval()来实际获取变量中的函数

var func = eval(funcStr);
如果我没记错的话,在Chrome和Opera中,只需呼叫

func();
调用该函数并显示警报

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

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

尝试

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

eval(funcStr);

func();

像这样使用eval:

var func = eval('(' + funcStr + ')');
这个怎么样

var func = new Function('alert("hello");');
要向函数添加参数,请执行以下操作:

var func = new Function('what', 'alert("hello " + what);');
func('world'); // hello world
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 () { alert('hello'); };
var otherFunc = func;
func = 'funky!';

function executeSomething(something) {
    something();
}
executeSomething(otherFunc); // Alerts 'hello'

IE无法
eval
功能(可能是出于安全原因)

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

var func = eval('[' + funcStr + ']')[0];
同样有效的是

var myFunc = function(myParam){
   // function body here
}

我意识到这很古老,但这是我在谷歌搜索中搜索匿名javascript函数字符串时得到的唯一有效结果

我终于在jquerygooglegroup上的一篇帖子中找到了解决方法

eval("false||"+data)
其中数据是函数字符串,如“function(){return 123;}”

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

EVAL without EVAL()

用法示例:

ABC=evalEx('return "ABC"');
nine=evalEx('return arguments[1]+arguments[2]',4,5);

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


log('eval:%s',eval((函数(foo){return foo.bar;})”)({bar:“12345”}));

这将产生如下输出


评估:12345

我们通过准备将字符串转换为实际JavaScript函数的通用函数解析器解决了这个问题:

var func = new Function('what', 'alert("hello " + what);');
func('world'); // hello world
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();
is JSFIDLE提供了一个函数s2f(),它接受函数的字符串表示形式并将其作为函数返回。

这也可以

var func = eval("_="+funcStr);

嘿,谢谢你,真管用!但是这样做看起来有点奇怪:D.我想知道为什么你需要一个以字符串文字表示的匿名函数,而不仅仅是一个命名函数?仅供参考:我正在为我的web应用定义自己的脚本。我正在编写一个解释器,需要动态构造JS函数,然后用它们创建实际的可执行函数。你为什么不用传统方式编写解释器呢?我不知道如何用“传统方式”编写它。。我发现这更容易。如果你能告诉我它是如何“传统”完成的,那就太好了。在将字符串传递到
eval
之前,请尝试将函数用括号括起来<代码>var funcStr=“(函数(){alert('hello');})”这是我最初的想法,但我很确定这只适用于对象。而且,无论是正确的方式还是错误的方式…,它在IE中都不起作用。在IE上尝试了这一点,但没有起作用
eval('(function(){return'Yay'))()
。但是,
eval('[function(){return'Yay'}][0]')()
worked这是一种优雅的方法,可以在所有浏览器中使用。谢谢:)可以。然而,函数文字不是语句,所以它们需要括号,它比数组更干净solution@Juan:错;它不能。尝试
javascript:alert(eval('(function(){return 3;}'))
My bad,我建议使用括号而不是数组解决方案,我不知道这在IEhaha中不起作用,你只是告诉我为什么谷歌打包应用程序不允许HTML中使用内联javascript:我不明白为什么其他人似乎没有这个问题。这是金子,谢谢!我们也可以这样做
eval(“!1 | |”+funcBody)