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

Different ways of creating function from string using eval

本文关键字:方法 函数 创建 eval 字符串 使用      更新时间:2023-09-26

是的,我知道 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创建功能的其他方法吗?

谢谢西蒙

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

function fname() { ... }

右大括号完成函数语句,表达式如下:

fname

由于函数已在作用域中,因此表达式fname仅引用函数。由于表达式是评估代码中的最后一项,因此eval返回的正是该函数引用。

代替fname,您可以编写当前作用域中任何函数的名称,例如 alert,然后由eval返回。

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

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

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