javascript - 如何在 Nashorn 中追踪 ReferenceError

标签 javascript java-8 nashorn

我遇到了一个问题,看起来它可能是 Nashorn 引擎中的某种错误,但我想不出一个好的方法来提炼一个可以证明它的测试用例。

我有一段代码(曾经有效!)大致如下所示:

'use strict';
function Dummy() {
  this.val = 'I am fubar';
  this.aContainer = [];
}
Dummy.prototype.toString = function() { return JSON.stringify(this);};

let obj = {};
obj.aMethod = function(arg) {
  let fubar = new Dummy();
  print('Okay so far');

  fubar.aContainer.push({"some":"thing"});
  print('Still okay');
  fubar.aContainer.push({"==": [{"var": "something_else"}, fubar.val]});

  return fubar;
};

print(obj.aMethod(null));

不幸的是,使用 jss --language=es6 -strict 运行这个例子不会崩溃。不过在我的真实代码中,我得到以下内容:

jdk.nashorn.internal.runtime.ECMAException: ReferenceError: “fubar” 未定义

如果我按如下方式更改代码,它运行良好:

'use strict';
function Dummy() {
  this.val = 'I am fubar';
  this.aContainer = [];
}
Dummy.prototype.toString = function() { return JSON.stringify(this);};

let obj = {};
obj.aMethod = function(arg) {
  let fubar = new Dummy();
  print('Okay so far');

  fubar.aContainer.push({"some":"thing"});
  print('Still okay');
  let x = fubar.val;
  fubar.aContainer.push({"==": [{"var": "something_else"}, x]});

  return fubar;
};

print(obj.aMethod(null));

我能做些什么来尝试进一步检测真实代码或以其他方式追踪这个问题吗?奇怪的是错误发生在执行的早期。如果我在方法中的任何地方调用 print() ,则永远不会打印。调用堆栈中我的代码的最后一行实际上是调用该方法的行。

我刚刚通过自动更新获取了一个新版本的 Java,但我需要查看此代码是否在其下运行。我当前的控制台版本是:

➜  ~ java -version
java version "1.8.0_77"
Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)

最佳答案

本文档包含您可以执行的所有跟踪 Nashorn 操作的完整摘要:

jdk8u-dev/nashorn/file/tip/docs/DEVELOPER_README

它描述了用于内部调试和检测目的的系统属性,以及用于相同目的的系统记录器。

关于javascript - 如何在 Nashorn 中追踪 ReferenceError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45405630/

相关文章:

java - thenAccept 和 thenApply 的区别

javascript - 在 JSObject、AbstractJSObject 中重写 hasMember() 有什么用?

javascript - 模糊背景没有出现

java - 管道中的限制(长)差序

ssl - sun.security.ssl.SSLSessionImpl payara 5

java - 使用参数从 java 调用 javascript 函数

java - Nashorn 加载 javascript 时出错 - 版本问题?

javascript - 未绑定(bind)的 JavaScript 文字会发生什么?

javascript - 我们什么时候在 javascript 导入中使用 '{ }'?

javascript - d3.js 中的多个重力点