nashorn - How to avoid "ReferenceError: "a" is not defined"

nashorn - How to avoid "ReferenceError: "a" is not defined"

下面的代码抛出 ReferenceError: "a" 未定义。 是否可以避免它并将变量视为空?

        ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
        Map<String, String> s = new HashMap<String, String>();
//        s.put("a", "a");
        Bindings bindings = engine.createBindings();
        bindings.putAll(s);
        Object res = engine.eval("!a", bindings);
        System.out.println(res);

如果您的作用域链中没有定义名称为 "a" 的任何变量,那么根据 ECMAScript 规范应该抛出 ReferenceError。如果您取消注释此行:

//        s.put("a", "a");

行,然后 "a" 被定义,因此没有 ReferenceError。

您可以使用 "typeof" 运算符检查变量是否已定义。 "typeof a == 'undefined'" 将对未定义的变量 "a" 求值为 false。对于未定义的变量,您不会得到 ReferenceError。同样,这是符合标准的行为。