我必须使用Rhino1.7R4及其org.mozilla.javascript包移植一个软件,以使用javax.script包及其 ScriptEngine(Java 6 和 7 中的Rhino ,Java 8 中的Nashorn)。
主要问题是堆栈范围(绑定)。使用 Rhino jar,我这样做:
Scriptable scope ...
Scriptable newScope = javascriptContext.initStandardObjects();
newScope.setParentScope(scope);
所以
- 如果一个变量在没有 var 的情况下定义,它是一个全局变量(根范围)
- 如果一个变量是用 var 定义的,它是一个局部变量(当前范围)
- 如果变量被访问或修改,引擎在其当前范围内查找,以及父级和祖父级......以及全局范围
这是 JS 标准行为。
如何使用 javax.script API做与setParentScope相同的操作?