使用eval从字符串创建函数的不同方法

时间:2012-08-05 18:48:50

标签: 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;") );
x.m("ccc")

前两个对我来说很清楚,但我想知道第三个。 有人可以解释在定义之后如何添加函数名称有助于eval完成这项工作吗? 您还知道使用eval创建功能的任何其他方法吗?

由于 Szymon

2 个答案:

答案 0 :(得分:1)

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

function fname() { ... }

结束括号结束了函数语句,表达式如下:

fname

由于函数已经在范围内,表达式fname只是引用函数。因为表达式是eval'ed代码中的最后一个,eval完全返回该函数引用。

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

答案 1 :(得分:0)

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

function declaration。 Eval会创建它,但不会返回它,所以在它之后会添加另一个只是求值为函数引用的语句。

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