java方法中的javascript变量生命周期

javascript variable lifecycle in the java method

本文关键字:变量 生命 周期 javascript 方法 java      更新时间:2023-09-26

我使用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