2013-05-10 33 views
4

我正在使用javax.script從java方法執行javascript。Java方法中的javascript變量生命週期

在我的java方法中,我調用了javascript中定義的不同函數。在javascript方面,我想保留一個全局變量,所以調用的輸出取決於前一個。

Java方法

public void myMethod(){ 
    ScriptEngineManager factory = new ScriptEngineManager(); 
    ScriptEngine engine = factory.getEngineByName("JavaScript"); 

    engine.eval(new java.io.FileReader("myTest.js")); 

    Invocable inv = (Invocable) engine; 

    Object obj = engine.get("obj"); 
    inv.invokeMethod(obj, "method1"); 

    inv.invokeMethod(obj, "method2"); 
} 

myTest.js

var obj=new Object(); 
var myStatus=1; 

obj.method1 = function(){ 
    myStatus++; 
}; 

obj.method2 = function(){ 
    for (var i=0; i<myStatus) 
    println('Hello world'); 
} 

什麼是腳本中聲明的變量的範圍? 如果我一個全局變量添加到使用

engine.put("globalVariable", myVariable) 

這是什麼變量的作用域的腳本?

感謝

回答

1
engine.put("globalVariable", myVariable) 

MEAS這個變量是屬於發動機,每個腳本引擎運行股這個變量,這裏有一個例子:如果你想通過一些腳本範圍參數

ScriptEngineManager factory = new ScriptEngineManager(); 
ScriptEngine engine = factory.getEngineByName("JavaScript"); 
engine.put("status",0); 
engine.eval("status++; println(status);"); //print 1 
engine.eval("status++; println(status);"); //print 2 

給你腳本,你應該使用綁定

ScriptEngineManager factory = new ScriptEngineManager(); 
ScriptEngine engine = factory.getEngineByName("JavaScript"); 

Bindings bindings=engine.createBindings(); 
bindings.put("status",0); 

Bindings bindings2=engine.createBindings(); 
bindings2.put("status",0); 

engine.eval("status++; println(status);",bindings); //print 1 
engine.eval("status++; println(status);",bindings2); //print 1 

接下來,變量定義在腳本,如果你不使用綁定,他們都是引擎範圍:

ScriptEngineManager factory = new ScriptEngineManager(); 
ScriptEngine engine = factory.getEngineByName("JavaScript"); 
engine.eval("var status=0; status++; println(status);"); //print 1 
engine.eval("status++; println(status);"); //print 2 

如果您使用綁定,在腳本中定義的變量是有約束力的範圍內,不會污染引擎範圍。

ScriptEngineManager factory = new ScriptEngineManager(); 
ScriptEngine engine = factory.getEngineByName("JavaScript"); 

Bindings bindings=engine.createBindings(); 
//bindings.put("status",0); 

Bindings bindings2=engine.createBindings(); 
//bindings2.put("status",0); 

engine.eval("var status=0; status++; println(status);",bindings); //print 1 
engine.eval("status++; println(status);",bindings2); // exception, status not defined