javascript variable lifecycle in the java method -
i'm using javax.script execute javascript java method.
in java method invoke different functions defined in javascript. on javascript side want keep global variable output of call depends on previous ones.
java method
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(){ (var i=0; i<mystatus) println('hello world'); }
what scope of variable declared in script? if add global variable script using
engine.put("globalvariable", myvariable)
what scope of variable?
thanks
engine.put("globalvariable", myvariable)
meas variable belonged engine, every script engines runs shares variable, here's example:
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
if want pass script scope parameters script, should use bindings
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
next, variable defined in script, if don't use bindings, engine scope:
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
if use bindings, variable defined in script binding scope, not pollute engines scope.
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
Comments
Post a Comment