簡體   English   中英

JavaScript(Rhino)使用庫或包含其他腳本

[英]JavaScript (Rhino) use library or include other scripts

在JDK6中,有沒有辦法在文件中加載多個腳本,並讓一個腳本引用另一個腳本的方法? 有點像“包括”?

我想你是在Rhino的全局對象/范圍的load()方法/屬性之后

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

如果你碰巧在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>

只要您使用相同的范圍來執行每個文件,它們就能夠從以前執行的文件中引用函數和變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM