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

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

c++ - qgraphicsview horizontal scrolling always has a vertical delta -