【发布时间】:2020-03-31 08:40:36
【问题描述】:
我正在尝试将一些库预加载到全局范围内(例如 chai.js)。这改变了一些对象的原型,我意识到这适用于 ENGINE_SCOPE,但不适用于 GLOBAL_SCOPE。
小例子:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
Bindings globalBindings = engine.createBindings();
engine.eval("Object.prototype.test = function(arg){print(arg);}", globalBindings);
//works as expected, printing "hello"
engine.getContext().setBindings(globalBindings, ScriptContext.ENGINE_SCOPE);
engine.eval("var x = {}; x.test('hello');");
//throws TypeError: null is not a function in <eval> at line number 1
engine.getContext().setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE);
engine.getContext().setBindings(globalBindings, ScriptContext.GLOBAL_SCOPE);
engine.eval("var x = {}; x.test('hello');");
是否有解决方法使其按预期工作,即更改从全局正确传播到引擎范围?
【问题讨论】:
-
您使用的是哪个 java 版本和 JVM 实现?自首次添加以来(我相信在 Java 7 中),Java 中的脚本在 Java 发布版本的过程中经历了几次变化。
-
我使用的是 Java 11 和 Liberica jdk,我相信是 openjdk
-
你知道nashorn is deprecated in JDK 11 - 虽然我不知道这是否是你的问题的原因。
-
我是。我用我的应用程序运送我自己的 jdk,所以没关系
-
我想你想运行几个脚本,每次都加载库,但以前的执行没有留下任何东西?例如,如果执行 1 创建了变量 x,那么在执行 2 开始时,您不希望 x 存在吗?
标签: java nashorn scriptengine