使用 eval 从字符串创建函数的不同方法
Different ways of creating function from string using 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创建功能的其他方法吗?
谢谢西蒙
首先,使用 function
声明(不是表达式),创建函数并将其放入当前范围:
function fname() { ... }
右大括号完成函数语句,表达式如下:
fname
由于函数已在作用域中,因此表达式fname
仅引用函数。由于表达式是评估代码中的最后一项,因此eval
返回的正是该函数引用。
代替fname
,您可以编写当前作用域中任何函数的名称,例如 alert
,然后由eval
返回。
function fname() { this.m = function(s){alert(s);}}
是一个函数声明。Eval 会创建它,但不返回它,所以在它之后添加另一个语句,该语句仅计算到函数引用。
在另外两个示例中,它将是一个函数表达式(周围有括号,或在数组文本内部),它本身计算为引用。
相关文章:
- 你能把一个匿名方法(函数)动态地变成一个命名方法吗
- 显示警报后调用方法/函数
- 使用来自 json 对象的参数动态调用方法/函数
- 创建具有动态参数排列的方法/函数
- 如何从其他 jsp 调用方法/函数以包含在另一个 jsp 的 jstree 中
- Objective-C 方法/函数调用.(来自JavaScript示例)
- 如何在android phongap应用程序中从javascript调用本机android方法(函数),而无需使用web
- 如何测试函数是否调用了特定的方法/函数
- 处理setTimeout(javascript)中的对象方法函数调用
- 简单级别,在DOM中选择元素,优化,创建方法函数
- 在不使用eval的情况下在方法函数中传递固定参数
- jQuery.html()方法函数文字参数
- animate方法函数执行意外延迟
- 对象方法javascript中的方法/函数
- Javascript私有方法:函数表达式与函数声明
- Jquery的oop重写方法函数
- 如何为数组/对象创建方法/函数
- 是否有可能发送我的对象与方法(函数)从服务器到客户端
- Javascript可以调用Django方法/函数吗
- 访问Backbone.js中的Ratchet 2.0方法/函数