从JavaScript中的文本创建类
我正在尝试为我的一个项目为NW.js()编写一个JavaScript加载程序。我已经对peg.js和estools(esprima/escodegen)有所了解,因此将JavaScript模块解析为各种函数和变量声明实际上没有问题,我的问题是将不同的文本表达式和声明实例化为单独的上下文/对象从JavaScript中的文本创建类,javascript,node.js,node-webkit,Javascript,Node.js,Node Webkit,我正在尝试为我的一个项目为NW.js()编写一个JavaScript加载程序。我已经对peg.js和estools(esprima/escodegen)有所了解,因此将JavaScript模块解析为各种函数和变量声明实际上没有问题,我的问题是将不同的文本表达式和声明实例化为单独的上下文/对象 eval()似乎无法将声明字符串转换为我选择的变量 $.context.fn = eval("function anonymous(a,b,c){ return a+b+c; }"); //$.conte
eval()
似乎无法将声明字符串转换为我选择的变量
$.context.fn = eval("function anonymous(a,b,c){ return a+b+c; }");
//$.context.fn = undefined..
我唯一能成功地将文本转换为变量的是函数:
$.context.fn = new Function('a','b','c','return a+b+c;');
//$.context.fn = function(a,b,c){ ... }
但似乎没有类似的方法将字符串转换为类,例如:
$.context.cl = new Class(params,body) ???
//error
问题:
是否有某种类型的加载程序库可供我使用,或者是否有一些技巧可让整个过程使用
eval()
?您可以使用eval创建函数:
(一)
(二)
(三)
您可以使用eval创建函数: (一) (二) (三) 你的问题是
function anonymous(a,b,c){ return a+b+c; }
是函数声明,而不是函数表达式。函数声明不返回任何内容:它们使用提供的名称定义新函数。在本例中,名称为匿名
您希望改用函数表达式。通过将函数括在括号中,可以生成函数表达式:
$.context.fn = eval("(function anonymous(a,b,c){ return a+b+c; })");
并以同样的方式工作:
$.context.cls = eval("(class MyArray extends Array {})")
你的问题是
function anonymous(a,b,c){ return a+b+c; }
是函数声明,而不是函数表达式。函数声明不返回任何内容:它们使用提供的名称定义新函数。在本例中,名称为匿名
您希望改用函数表达式。通过将函数括在括号中,可以生成函数表达式:
$.context.fn = eval("(function anonymous(a,b,c){ return a+b+c; })");
并以同样的方式工作:
$.context.cls = eval("(class MyArray extends Array {})")
eval
适用于任何表达式:
但是,eval
始终捕获本地范围,这可能是您不想要的。或者使用函数构造函数的技巧获得所需的作用域。要实例化一个类,只需创建一个返回所述类(或任何其他语言构造)的函数:
eval
适用于任何表达式:
但是,eval
始终捕获本地范围,这可能是您不想要的。或者使用函数构造函数的技巧获得所需的作用域。要实例化一个类,只需创建一个返回所述类(或任何其他语言构造)的函数:
$.context.fn = eval("(function anonymous(a,b,c){ return a+b+c; })");
$.context.cl = eval("(class { constructor() { … } … })");
$.context.fn = (new Function("function named(a,b,c){ return a+b+c; }\nreturn named;"))();
$.context.cl = (new Function("class Example { constructor() { … } … }\nreturn Example;"))();