【问题标题】:Create Classes from Text in JavaScript在 JavaScript 中从文本创建类
【发布时间】:2017-02-03 06:18:50
【问题描述】:

我正在尝试为我的 NW.js (node-webkit) 项目编写一个 JavaScript 加载器。我已经对 peg.js 和 estools (esprima/escodegen) 有所了解,因此将 JavaScript 模块解析为各种函数和变量声明真的没问题,我遇到的问题是实例化不同的文本表达式和声明到一个单独的上下文/对象中。

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() 一起工作?

【问题讨论】:

    标签: javascript node.js node-webkit


    【解决方案1】:

    eval 应该适用于任何表达式

    $.context.fn = eval("(function anonymous(a,b,c){ return a+b+c; })");
    $.context.cl = eval("(class { constructor() { … } … })");
    

    但是,eval 总是捕获本地范围,这可能是您不想要的。要么选择global eval,要么使用函数构造函数的技巧来获得你想要的范围。要实例化一个类,只需创建一个返回该类(或任何其他语言结构)的函数:

    $.context.fn = (new Function("function named(a,b,c){ return a+b+c; }\nreturn named;"))();
    $.context.cl = (new Function("class Example { constructor() { … } … }\nreturn Example;"))();
    

    【讨论】:

      【解决方案2】:

      你的问题是

      function anonymous(a,b,c){ return a+b+c; }
      

      是函数声明,而不是函数表达式。函数声明不返回任何内容:它们使用提供的名称定义一个新函数。在这种情况下,名称是anonymous

      您想改用函数表达式。 See this MDN section for an explanation of the differences. 可以通过将函数括在括号中来制作函数表达式:

      $.context.fn = eval("(function anonymous(a,b,c){ return a+b+c; })");
      

      Class declarationsclass expressions 的工作方式相同:

      $.context.cls = eval("(class MyArray extends Array {})")
      

      【讨论】:

        【解决方案3】:

        您可以使用 eval 创建函数:

        1)

        eval("function anonymous(a,b,c){ return a+b+c; }");
        console.log(anonymous(1,2,3));
        

        2)

        eval('var fn = function(a,b,c) { return a+b+c;};');
        console.log(fn(1,2,3));
        

        3)

        eval("function anonymous(a,b,c){ return a+b+c; }");
        var fn = anonymous;
        console.log(fn(1,2,3));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-01
          • 1970-01-01
          • 2021-10-11
          • 2015-10-24
          相关资源
          最近更新 更多