是的,我知道艾尔瓦尔是邪恶的,但是...
有几次我看到一个函数是以几种不同的方式从字符串创建的:
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
发布于 2012-08-06 02:55:02
首先,使用function声明(不是表达式)创建函数并将其放入当前作用域:
function fname() { ... }右大括号结束函数语句,表达式如下:
fname由于该函数已在作用域中,因此表达式fname仅引用该函数。因为表达式是经过求值处理的代码中的最后一项,所以eval返回的正是那个函数引用。
你可以在当前作用域中编写任何函数的名称,而不是fname,例如alert,然后eval将返回该名称。
发布于 2012-08-06 02:56:10
function fname() { this.m = function(s){alert(s);}}是一个function declaration。Eval会创建它,但不会返回它,所以在它之后添加了另一个语句,该语句只是计算为函数引用。
在另外两个示例中,它将是一个函数表达式(用括号括起来,或在数组文字中),其本身的计算结果为引用。
https://stackoverflow.com/questions/11819109
复制相似问题