代码之家  ›  专栏  ›  技术社区  ›  Ayman

javascript(Rhino)使用库或包括其他脚本

  •  26
  • Ayman  · 技术社区  · 16 年前

    在JDK6中,有没有一种方法可以加载多个脚本(每个脚本在一个文件中),并让一个脚本引用另一个脚本的方法?有点像“include”?

    4 回复  |  直到 11 年前
        1
  •  27
  •   Alana Storm    16 年前

    我想你在追求 load() method/property Rhino的全局对象/范围

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

    这将加载一个JavaScript源文件,类似于PHP中的include/require。一旦加载了一个文件,您就可以调用和运行或使用加载文件中定义的任何对象。

    当你使用犀牛壳时,事情就是这样工作的,这是我知道的唯一的上下文(你的问题提到了Java SDK,这是在我的经验之外)。

        2
  •  10
  •   Chris Plock    13 年前

    如果您碰巧尝试在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
  •  10
  •   Daniel Pacak    11 年前

    这是一个真实的例子,即运行 esprima 带有Rhino 1.7R4的分析器。

    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 对象。

        4
  •  6
  •   Matthew Crumley    16 年前

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