Rhino 1.7.14中VERSION_ES6 flag使用及ES6特性启用问题咨询
Rhino 1.7.14 启用ES6特性(含Promise)的正确方法
一、VERSION_ES6 flag的正确用法
调用setLanguageVersion(Context.VERSION_ES6)的方向是对的,但失败往往是因为设置时机不对。必须在初始化标准对象、执行脚本之前完成版本设置,正确的代码流程如下:
Context ctx = Context.enter(); try { // 第一步:设置ES6语言版本 ctx.setLanguageVersion(Context.VERSION_ES6); // 第二步:初始化标准作用域 Scriptable scope = ctx.initStandardObjects(); // 第三步:执行包含ES6特性的脚本 Object result = ctx.evaluateString(scope, "new Promise((resolve) => { resolve('ES6 Promise works'); })", "ES6TestScript", 1, null); } finally { Context.exit(); }
如果把版本设置放在initStandardObjects之后,或者脚本开始执行后才设置,ES6特性(比如Promise)不会被启用,这是最常见的错误。
二、确保ES6特性完全启用的额外配置
Rhino 1.7.14的ES6支持需要配合以下配置才能拉满:
- 启用严格模式:在脚本开头添加
'use strict';,或者通过代码设置ctx.setOptimizationLevel(-1);(优化模式下部分ES6特性可能被屏蔽) - 检查jar包完整性:确保使用的是完整的Rhino 1.7.14 jar包,不要混用旧版本的Rhino文件
- 避免自定义作用域限制:如果使用自定义的Scriptable对象,要确保没有禁用默认的ES6全局对象扩展
三、其他启用ES6特性的途径
除了代码中设置版本,还可以通过以下方式启用:
- 命令行启动时指定版本:使用Rhino的命令行工具时,添加
-version es6参数,示例:java -jar rhino-1.7.14.jar -version es6 - 手动补充缺失特性:如果个别ES6对象未自动加载(极少见),可以手动注册到作用域,比如:
ScriptableObject.defineClass(scope, org.mozilla.javascript.Promise.class);
内容的提问来源于stack exchange,提问作者Rohinth S
相关产品推荐
相关产品推荐

