1

是的,我知道 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 创建函数的任何其他方法吗?

谢谢席蒙

4

2 回答 2

1

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

function fname() { ... }

右大括号结束了函数语句,下面是一个表达式:

fname

由于函数已经在作用域中,因此表达式fname只是引用函数。并且因为表达式是评估代码中的最后一件事,所以会eval准确返回该函数引用。

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

于 2012-08-05T18:55:01.573 回答
0
function fname() { this.m = function(s){alert(s);}}

是一个函数声明。Eval 会创建它,但不会返回它,所以在它之后添加了另一个语句,它只计算函数引用。

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

于 2012-08-05T18:56:09.857 回答