是的,我知道 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
返回。
关于javascript - 使用 eval 从字符串创建函数的不同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11819109/