4

我正在使用 javax.script 从 java 方法执行 javascript。

在我的 java 方法中,我调用了 javascript 中定义的不同函数。在 javascript 方面,我想保留一个全局变量,因此调用的输出取决于之前的输出。

方法

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)

这个变量的范围是什么?

谢谢

4

1 回答 1

1
engine.put("globalVariable", myVariable)

因为这个变量属于引擎,引擎运行的每个脚本都共享这个变量,这里有一个例子:

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
于 2013-05-10T06:45:04.643 回答