为什么在visualvm (jhat?) oql中使用javascript有时会令人困惑



我很想知道为什么visualvm OQL有以下语句的问题:

select filter(heap.objects("java.util.HashMap"), isTrue(it));
function isTrue(object) {  
  return true;  
}

的例外是:

javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "it" is not defined. (#1)

相比之下,visualvm OQL在以下任何示例中都没有问题:

示例1(注意"it"没有引号):

select filter(heap.objects("java.util.HashMap"),  
    function(it) {  
      return true;  
    });

示例2(注意"it"被加了引号):

select filter(heap.objects("java.util.HashMap"), isTrue("it"));  
function isTrue(object) {  
  if (object instanceof String) {  
    throw "String passed!";  
  }  
  return true;  
}

示例3 ("function(it)"由于某种原因在OQL中被特殊处理?):

select filter(heap.objects("java.util.HashMap"), function(it) { return isTrue(it); });
function isTrue(object) {  
  return true;  
}

我问这个问题是因为它看起来不直观,而当我试图创建一些可用的东西时,非直观行为的变化出乎意料地出现并减慢了我的速度。

您的不同语法不等于。第一:

select filter(heap.objects("java.util.HashMap"), isTrue(it));

以参数it调用isTrue,并将其结果传递给filter()函数。此时还没有定义变量it,因此出现了错误。

你的"示例1"one_answers"示例3"都传递了一个函数作为第二个参数给filter()函数。您传入的函数(假定)是作为filter()将调用的回调函数,其中参数it将由filter()设置。

你的"示例2"有点像第一个代码,因为它立即调用isTrue("it"),但在这种情况下,它是用字符串字面量调用它,所以你没有参数未定义的问题。但是,这里还是将函数的结果作为参数传递给filter(),而不是传递函数本身。

filter() 的正确用法是传递给它一个函数(函数引用-函数名称不带括号-或函数表达式,如"示例1")。所以试试下面的命令:

select filter(heap.objects("java.util.HashMap"), isTrue);
function isTrue(object) {  
  return true;  
}
// OR your example 1

相关内容

  • 没有找到相关文章

最新更新