从 Nashorn 中删除全局变量

Remove Globals from Nashorn

有没有办法在 Nashorn 中删除对全局变量的访问

$ENV=undefined

?

我进行了一些搜索,但除了如何使用全局变量外,我看不到任何其他内容。

此外,是否有 arguments/flags 我可以传递到脚本引擎的列表?我目前正在做 --no-java,但我无法在任何地方找到完整的列表。

感谢任何帮助。

您可以通过 jjs -help.

获得 command-line 个选项的列表

我不确定是否删除全局变量,但我对此表示怀疑。 Nashorn 使用 Global class 表示 ECMAScript global 对象,如 here.

所述

The default context's ENGINE_SCOPE is a wrapped instance of ECMAScript "global" object - which is the "this" in top level script expressions. So, you can access ECMAScript top-level objects like "Object", "Math", "RegExp", "undefined" from this scope object. Nashorn Global scope object is represented by an internal implementation class called jdk.nashorn.internal.objects.Global.

Global class 有一堆基本的 ECMAScript 管道以不可变的方式嵌入其中,因为没有它 javascript 根本无法工作(没有 ObjectFunction 原型,例如)。该页面指出,尝试使用替代对象作为全局对象将导致引擎将您的自定义 'global' 对象放入新的 Global 实例中。尝试 运行 Java 没有那个 global 管道的脚本根本行不通。

现在,如果您想要做的是限制脚本可用的 Java classes,这相对简单(尽管不如我希望的那么简单)。

ClassFilter filter = new ClassFilter() {
    @Override
    public boolean exposeToScripts(String name) {
        // This would disable all Java classes
        return false;
    }
};
ScriptEngine engine = new NashornScriptEngineFactory().getScriptEngine(filter);

这里的主要缺点是 ClassFiltergetScriptEngine(ClassFilter) 方法不是 javax.scripting API 的一部分,您必须访问 Nashorn-specific class直接在jdk.nashorn.api.scripting包中。