2009-03-16 17 views

答えて

26

は、私はあなたがRhinoのグローバルオブジェクト/スコープ/含める方法に似

load("file1.js"); 
load("file2.js"); 
load("file3.js"); 

methodFromFileOne(); 
var bar = methodFromFileTwo(); 
var etc = dotDotDot(); 

これはjavascriptのソースファイルをロードするには、PHPになります必要のload() method/property後にしていると思います。ファイルをロードすると、ロードされたファイルで定義されたオブジェクトを呼び出し、機能させたり、オブジェクトを使用したりすることができます。あなたは、私が知っている唯一のコンテキストであるRhinoのシェルを、使用しているときは、ことが起こる場合

これは、(あなたの質問は、経験の私の領域の外にあるJava SDKを、言及した)物事の仕組み

+0

これはRhinoシェルの外で利用できますか? – Thilo

+0

わかりません、それは私の賃金率ではありません。 (それを反映するように質問を更新しました) –

6

各ファイルを同じスコープで実行する限り、以前に実行されたファイルから関数と変数を参照することができます。

+0

大きな助け、ありがとう –

10

ですアリの中にこれを実行しようとすると、このエラーが表示される場合があります。

<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> 
+0

>> '' + <<はここで重要です! –

9

実際の例この時間、つまりを実行していますパーサー(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オブジェクトを再利用しています。

関連する問題