2009-03-16 13 views

Odpowiedz

26

myślę, że jesteś po load() method/property globalnego obiektu/zakres

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

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

Spowoduje to załadowanie pliku źródłowego JavaScript, podobny do tego, jak to/wymagać będzie w PHP Rhino. Po załadowaniu pliku będziesz mógł wywoływać i funkcjonować lub używać dowolnego obiektu zdefiniowanego w załadowanym pliku.

To jak to wszystko działa, gdy używasz Rhino powłokę, która jest tylko kontekst wiem (Twoje pytanie wspomniano Java SDK, który jest poza moim obszarze doświadczenia)

+0

Czy jest dostępna poza powłoką Rhino? – Thilo

+0

Nie jestem pewien, to nie moja stawka. (zaktualizowano pytanie, aby to odzwierciedlić) –

6

Dopóki użyjesz tego samego zakresu do wykonania każdego pliku, będą one mogły odwoływać się do funkcji i zmiennych z wcześniej wykonanych plików.

+0

Duża pomoc, dzięki –

10

jeśli zdarzy ci się być starając się zrobić to w ciągu mrówki, można zobaczyć ten błąd:

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

ale można go ominąć:

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

>> >><< jest tutaj bardzo ważne! –

9

prawdziwa natura Przykład w tym czasie, to znaczy prowadzenie esprima analizator składni z 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(); 

Po uruchomieniu tego kodu, należy widzieć wyjście następująco:

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

Więc rzeczywiście, cała sztuka polega na ponownym obiekt globalScope.

Powiązane problemy