2009-03-16 9 views

cevap

26

Sana Rhino küresel nesne/kapsam/include nasıl benzer

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

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

Bu bir javascript kaynak dosyası yükleyecek, PHP'de olacak gerektiren bir load() method/property sonra olduğunu düşünüyorum. Bir dosyayı yükledikten sonra, yüklenen dosyada tanımlanan herhangi bir nesneyi arayabilir ve çalıştırabilir veya kullanabilirsiniz.

Bu şeyler bildiğim tek bağlamdır Rhino kabuğu, kullanırken nasıl çalıştığını size olmak için ne

+0

Bu Rhino kabuğunun dışında kullanılabilir mi? – Thilo

+0

Emin değilim, bu benim ödeme oranım değil. (Bunu yansıtmak için soruyu güncelledi) –

6

+0

Büyük yardım, teşekkürler –

10

(soru deneyim benim alanının dışında Java SDK, söz) karınca içinde bu yapmaya çalışıyor, bu hatayı görebilirsiniz:

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

ama bunu kaçabilir miyiz:

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

>> '' + << burada büyük önem taşıyor! –

9

gerçek hayattan bir örnek bu kez, yaniçalışan Rhino 1.7R4 ileayrıştırıcı. aşağıdaki gibi

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(); 

Bu kodu çalıştırdıktan sonra, çıkış görmelisiniz:

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

Yani gerçekten hüner globalScope nesneyi yeniden içindedir.

İlgili konular