Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.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,是的,我知道eval是邪恶的,但是 有几次我看到从字符串以几种不同的方式创建函数: var s = "function fname() { this.m = function(s){alert(s);}}"; //1 var x = new( eval("("+s+")") ); x.m("aaa") //2 var x = new( eval('[' + s + ']')[0] ); x.m("bbb") //3 var x = new ( eval(s + " fname;") );

是的,我知道eval是邪恶的,但是

有几次我看到从字符串以几种不同的方式创建函数:

var s = "function fname() { this.m = function(s){alert(s);}}";

//1
var x = new( eval("("+s+")") );
x.m("aaa")

//2
var x = new( eval('[' + s + ']')[0] );
x.m("bbb")

//3
var x = new ( eval(s + " fname;") );
x.m("ccc")
前两个我很清楚,但我想知道第三个。 有人能解释一下在函数定义后添加函数名如何帮助eval完成这项工作吗? 您还知道使用eval创建函数的其他方法吗

谢谢
Szymon

首先,使用
函数
声明(不是表达式),创建函数并将其放入当前范围:

function fname() { ... }
右大括号完成函数语句,表达式如下:

fname
由于函数已在作用域中,表达式
fname
仅指函数。由于表达式是求值代码中的最后一个内容,
eval
精确返回该函数引用


您可以编写当前范围内任何函数的名称,而不是
fname
,例如
alert
,然后由
eval
返回该名称。首先,使用
函数
声明(不是表达式),创建函数并将其放入当前范围:

function fname() { ... }
function fname() { this.m = function(s){alert(s);}}
右大括号完成函数语句,表达式如下:

fname
由于函数已在作用域中,表达式
fname
仅指函数。由于表达式是求值代码中的最后一个内容,
eval
精确返回该函数引用

您可以编写当前范围内任何函数的名称,而不是
fname
,例如
alert
,然后由
eval
返回

function fname() { this.m = function(s){alert(s);}}
这是一个很好的例子。Eval将创建它,但不返回它,因此在它之后添加另一条语句,该语句只对函数引用求值

在其他两个示例中,它将是一个函数表达式(在数组文字的周围或内部带有括号),其本身的计算结果为引用

这是一个很好的例子。Eval将创建它,但不返回它,因此在它之后添加另一条语句,该语句只对函数引用求值


在其他两个示例中,它将是一个函数表达式(括号括在数组文字周围或数组文字内部),其本身的计算结果为引用。

如果它是一个语句,它将包含一个表达式(带函数)。不是,是谢谢,更正了。我想强调的是,它不是一个表达式。谢谢你们Yogu和Bergi让它更清楚也许我们加了一句话,说“要返回某个东西,评估需要返回某个东西(表达式)”对吗?你们明白我的意思了吗?我已经编辑了它,希望它现在更清晰一些。如果它是一个语句,它将包含一个表达式(带函数)。不是,是谢谢,更正了。我想强调的是,它不是一个表达式。谢谢你们Yogu和Bergi让它更清楚也许我们加了一句话,说“要返回某个东西,评估需要返回某个东西(表达式)”对吗?你们明白我的意思了吗?我已经编辑了它,希望它现在更清晰一点。
eval('(function(){return'+s+'}())
也可以使用
eval('(function(){return'+s+}()))
也可以使用