【问题标题】:JavaScript (Rhino) use library or include other scriptsJavaScript (Rhino) 使用库或包含其他脚本
【发布时间】:2010-10-13 14:48:51
【问题描述】:

在 JDK6 中,有没有办法加载多个脚本,每个脚本都在一个文件中,并让一个脚本引用另一个脚本的方法?有点像“包含”?

【问题讨论】:

    标签: java javascript rhino


    【解决方案1】:

    这次是一个真实的例子,即使用 Rhino 1.7R4 运行 esprima 解析器。

    import org.mozilla.javascript.Context;
    import org.mozilla.javascript.Scriptable;
    import org.mozilla.javascript.ScriptableObject;
    ...
    
    Context context = Context.enter();
    Scriptable globalScope = context.initStandardObjects();
    Reader esprimaLibReader = new InputStreamReader(getClass().getResourceAsStream("/esprima.js"));
    context.evaluateReader(globalScope, esprimaLibReader, "esprima.js", 1, null);
    
    // Add a global variable out that is a JavaScript reflection of the System.out variable:
    Object wrappedOut = Context.javaToJS(System.out, globalScope);
    ScriptableObject.putProperty(globalScope, "out", wrappedOut);
    
    String code = "var syntax = esprima.parse('42');" +
        "out.print(JSON.stringify(syntax, null, 2));";
    
    // The module esprima is available as a global object due to the same
    // scope object passed for evaluation:
    context.evaluateString(globalScope, code, "<mem>", 1, null);
    Context.exit();
    

    运行此代码后,您应该会看到如下输出:

    {
      "type": "Program",
      "body": [
        {
          "type": "ExpressionStatement",
          "expression": {
            "type": "Literal",
            "value": 42,
            "raw": "42"
          }
        }
      ]
    }
    

    确实,诀窍在于重用globalScope 对象。

    【讨论】:

      【解决方案2】:

      如果您碰巧尝试在 ant 中执行此操作,您可能会看到以下错误:

      <script language="javascript">
          load('foo.js');
      </script>
      javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: TypeError: Cannot find function load.
      

      但你可以回避它:

      <script language="javascript">
          eval(''+new String(org.apache.tools.ant.util.FileUtils.readFully(new java.io.FileReader('foo.js'))));
      </script>
      

      【讨论】:

      • >>''+
      【解决方案3】:

      我认为你在寻找 Rhino 的全局对象/范围的 load() method/property

      load("file1.js");
      load("file2.js");
      load("file3.js");
      
      methodFromFileOne();
      var bar = methodFromFileTwo();
      var etc = dotDotDot();
      

      这将加载一个 javascript 源文件,类似于 PHP 中的 include/require 方式。加载文件后,您将能够调用和运行或使用加载文件中定义的任何对象。

      这就是您使用 Rhino shell 时的工作方式,这是我知道的唯一上下文(您的问题提到了 Java SDK,这超出了我的经验范围)

      【讨论】:

      • 这在 Rhino shell 之外可用吗?
      • 不确定,这不是我的工资标准。 (更新了问题以反映这一点)
      【解决方案4】:

      只要您使用相同的作用域来执行每个文件,它们就可以从之前执行的文件中引用函数和变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-21
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多