我使用javax.script从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)
这个变量的作用域是什么?
感谢
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